通常使用哪种解决方案,模式?
我想摆脱控制器,模型等中的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
答案 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,您甚至可以在库中使用一些默认视图供项目使用(如果需要,当然可以覆盖这些视图)。