PHP设计模式:一个脚本中的多个网站

时间:2011-11-22 09:58:13

标签: php design-patterns

通常使用哪种解决方案,模式?

我想摆脱控制器,模型等中的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语句的情况下解决多个域的此问题?

更新

如何描述我需要的东西。我正在尝试使用默认逻辑创建可重用的控制器。只需在所需位置(占位符)填充/混合控制器与域相关逻辑,数据修改等。控制器模板可能存在,任何模式都存在吗?

为占位符提供所有必需(CURRENT)数据,以便在需要时进行修改或进一步处理并将其返回。

猜猜我必须创造自己的“自行车”。 :d

5 个答案:

答案 0 :(得分:4)

根据您提供的信息,我假设您希望根据域以不同方式显示数据。同时假设您的数据保持不变,您可以使用策略模式来解决您的问题。

您的课程结构如下所示:

    class yourClass
    {
        protected $_strategy;

        public function setStrategy($strategy)
        {
            $this->_strategy = $strategy;
        }

        public function showYourData()
        {
            return $this->_strategy->show($this)
        }
    }

对于每个域,您构建一个单独的策略类,如下所示:

    class domainStrategy
    {
        public function show(yourClass $yourClass)
        {
             // Get your classdata here
             $data = $yourClass->whateverFunctionYouNeed();
             // Do what you want for this domain
             return $output;
        }
    }

我希望这可以让你开始,我相信你可以在需要时找到更多的策略模式文档

答案 1 :(得分:2)

我建议创建一个根据域标准加载信息的调度程序。

类似的东西:

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

...
?>

答案 2 :(得分:0)

  

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()或其他任何内容,但只有在您确定了自己的域名以及要解决的控制器之后才会这样做。

答案 3 :(得分:0)

为每个域创建一个文件夹。

当用户访问网站(可能是contactus.php页面)时,此页面将检查域文件夹中是否存在相应的contactus.php文件。如果有,它将包含该文件,否则,它将执行它的默认行为。

答案 4 :(得分:0)

  

想要摆脱这种疯狂。无法想象什么会有什么混乱,什么时候会有至少20个网站。

为什么你会在一个项目中放置20个网站???

如果您使用的是apache,请使用单独的vhosts

http://httpd.apache.org/docs/2.0/vhosts/examples.html

其他网络服务也具有此功能(尽管它们可能有不同的名称)。

如果您想要阻止您需要复制项目中的公共/共享功能。

只需设置某种形式的库,并使用您在不同项目中使用的常用功能。

如果您查看MVC模式http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller,您甚至可以在库中使用一些默认视图供项目使用(如果需要,当然可以覆盖这些视图)。