gpt4 book ai didi

php - MVC : Instantiate Controller In Router?

转载 作者:可可西里 更新时间:2023-11-01 01:01:19 25 4
gpt4 key购买 nike

我想弄清楚从路由器类中启动 Controller 是否是不好的做法。从我所能找到的一点点,有人说路由器不应该处理实例化 Controller 。下面是我如何开始开发我的路由器类。

示例(注意为了打字我省略了很多。)

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();
}

}

最佳答案

为了回答您的问题,我认为它不会违反关注点分离。路由器不应该担心哪个 Controller 处理它的请求,或者更确切地说,该 Controller 是如何产生的。它只需要知道在某个时候,即使出现 404,某个 Controller 也会处理它。

现在在路由中注入(inject)一个 Controller 就可以了,然后你可以像这样将它原型(prototype)化为一个接口(interface),

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

否则你必须有很多硬链接(hard link),很多依赖,如果你需要第二个 Controller 怎么办?

例如,假设您需要一个管理 Controller 和一个公共(public) Controller ,以及一个成员 Controller 。然后你构建 3 个路由器。

就我个人而言,我正在为我正在从事的项目计划的方法是使用事件驱动系统,其中将像传统路由系统一样默认分配一组 Controller (类/方法/参数... ) ,假设将在 Controller 文件夹中搜索它们。否则, Controller 将注册自己以监听特定的 http 请求。所以流程有点像这样。

这个请求是否有注册的监听器,如果我们的 Controller 文件夹中没有任何 Controller 与路由模式匹配,最后是一个 404 Controller ,它将处理任何请求。

如果其中任何一个捕获到事件(正在监听的事件被终止)。与纯硬连线路由相比,它的优势在于,假设我想制作一个需要支付页面的支付插件,我如何将其作为第三方供应商放入 Controller 文件夹中?这样一来,只需要激活插件,它会注册“支付”路由,并在它自己的包中进行监听。

也许这不是您的项目所关心的问题,但它是需要考虑的事情。

关于php - MVC : Instantiate Controller In Router?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24896392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com