簡體   English   中英

PHP設計模式:一個腳本中包含多個網站

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM