MVC:在路由器中实例化控制器?

时间:2014-07-22 19:41:39

标签: php url-rewriting single-responsibility-principle

我试图找出从路由器类中启动控制器的不良做法。从我能找到的一点点来看,有人说路由器不应该处理实例化控制器。下面是我开始开发路由器类的方法。

示例(注意我为了输入而省略了很多。)

class Router {
 private $url, $controller;
 public function __construct($url)
 {
  $this->url = $url;
  $this->map(); /* maps url to controller and action*/

  /*dispatch controller*/
  $this->dispatch();
  }

 private function dispatch()
 {
  $controller = new $this->controller();
  $controller->executeAction();
  }

 }

1 个答案:

答案 0 :(得分:4)

为了回答你的问题,我不会违反关注点。路由器不应该担心控制器处理它的请求,或者说控制器是如何形成的。它只需要知道在某些时候,即使在404的情况下,某些控制器也会处理它。

现在将一个控制器注入到路径中就可以了,然后你就可以将它原型化为一个类似的接口,

public function dispatch(ControllerInterface $Controller){
   .....
}

否则你需要很多连接,很多依赖,如果你需要第二个控制器怎么办?

例如,假设您需要管理员控制器和公共控制器以及成员控制器。然后你建立3个路由器。

我个人正在为我正在研究的项目计划的方法是使用一个事件驱动系统,默认情况下会分配一组控制器,如传统的路由系统(class / method / args ... ),说一个控制器文件夹将被搜索它们。另一方面,控制器将注册自己以监听特定的http请求。所以流程有点像这样。

此请求是否有任何已注册的侦听器, 如果我们的控制器文件夹中没有与路由模式匹配的控制器, 最后是一个404控制器,可以处理任何请求。

如果其中任何一个发现事件(被收听的事件被终止)。这比纯粹的有线路线更有优势,比如说我想制作一个支付插件,需要一个支付页面,如何把它作为第三方供应商放在控制器文件夹中呢?这样一个人只需要激活插件,该插件可以注册"付款"路线,并在其自己的包裹内聆听。

也许这不是您项目的关注点,但需要考虑一下。