[英]Multiple websites inside Docker nginx container - PHP container works only with one
[英]PHP design patterns: Multiple websites inside one script
通常使用什么解決方案,模式?
我想擺脫控制器,模型等中的if / else語句。
例如:
if($domain==1) {
// do this
}
elseif($domain==2) {
// do this
}
elseif...
想要擺脫這種瘋狂。 當至少有20個網站時,無法想象會有什么混亂。
目前,我正在為每個域使用配置和路由文件。 但這還不夠。
無法擺脫模型和控制器內部的混亂局面。
我在考慮某種占位符,並為每個域使用用於那些占位符+魔術調用的方法創建單獨的靜態類。
例如我在控制器內部有動作:
public function postAction(){
$model=new Model();
$this->view->data=$model->get($placeholder_generates_and_return_settings_array); // else default is used
// custom placeholder
// execute custom class method if it's exist
// some model again
// custom placeholder
// execute custom class method if it's exist
// etc
}
當前視圖位於占位符類中,可以分配類型。 像數據修改,模型的配置生成等。
您如何用多個域解決此問題,而又不為它們內部的每個域克隆控制器,模型或創建無數的if / elseif語句?
UPDATE
如何描述我所需要的。 我正在嘗試創建具有默認邏輯的可重用控制器。 只需在所需的位置(占位符)中填充/混合具有域相關邏輯的控制器,進行數據修改等。可能存在類似於控制器模板的東西,是否存在任何模式?
為占位符提供所有必需的(當前)數據,以便在需要時進行修改或進一步處理並將其返回。
猜猜我將不得不創建自己的“自行車”。 :d
根據您提供的信息,我假設您希望基於域以不同的方式顯示數據。 另外,假設您的數據保持不變,則可以使用策略模式來解決問題。
您的類結構將如下所示:
class yourClass
{
protected $_strategy;
public function setStrategy($strategy)
{
$this->_strategy = $strategy;
}
public function showYourData()
{
return $this->_strategy->show($this)
}
}
對於每個域,您可以構建一個單獨的strategyclass,如下所示:
class domainStrategy
{
public function show(yourClass $yourClass)
{
// Get your classdata here
$data = $yourClass->whateverFunctionYouNeed();
// Do what you want for this domain
return $output;
}
}
我希望這可以幫助您入門,我確定您可以在需要時找到更多有關strategypattern的文檔。
我建議創建一個根據域條件加載信息的調度程序。
就像是:
dispatch.php
<?php
...
$domain = get_domain_function(); // here you may automate the domain retrieval
include ('controllers/' . $domain . '.php')
...
?>
controllers / domain1.php ... controllers / domainn.php
<?php
...
do the domain specific business logic here
...
?>
if($domain==1) {
// do this
}
elseif($domain==2) {
// do this
}
elseif...
我很好奇對於重要的事情“執行此操作”是您需要對所有站點都執行此操作。 在不知情的情況下不可能專門回答這個問題。
我可以假設您想設置一些變量,例如,建立會話,也許創建具有不同參數的其他(數據庫)對象或在模板中設置一些變量。
您可以使用某種控制器來做到這一點,但是同樣,這取決於您要實現的目標。
class Controller
{
public abstract function DoAction1();
// Group shared functionality, call it with different parameters
public function ShowHomePage($view)
{
$template->assign('view', $view);
}
}
class Domain1Controller extends Controller
{
public function DoAction1()
{
// do this
}
}
class Domain2Controller extends Controller
{
public function DoAction1()
{
// do this
}
}
在調用代碼(路由器)中,您只需調用Controller->ShowHomePage($view)
或Controller->DoAction1()
或其他任何東西,但是只有在確定了您要位於哪個域以及要尋址的控制器之后。
每個域都有一個文件夾。
當用戶訪問網站時(可能是contactus.php頁面),該頁面將檢查域文件夾中是否有對應的contactus.php文件。 如果存在,它將包含該文件,否則,它將執行它的默認行為。
想要擺脫這種瘋狂。 當至少有20個網站時,無法想象會有什么混亂。
為什么您會在一個項目中投入20個網站???
如果您使用的是Apache,請僅使用單獨的vhosts
。
http://httpd.apache.org/docs/2.0/vhosts/examples.html
其他Web服務也具有此功能(盡管它們可能具有不同的名稱)。
如果要防止,則需要在項目中復制通用/共享功能。
只需設置某種形式的庫並使用您在不同項目中使用的常用功能即可。
如果您查看MVC模式http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller,您甚至可以在庫中有一些默認視圖供項目使用(如果需要)這些當然可以被覆蓋)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.