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

Php MVC:在路由器中实例化控制器?,php,url-rewriting,single-responsibility-principle,Php,Url Rewriting,Single Responsibility Principle,我试图弄清楚从路由器类中启动控制器是否是一种不好的做法。从我所能找到的一点信息来看,有人说路由器不应该处理实例化控制器。下面是我如何开始开发我的路由器类 示例(注意,为了打字,我省略了很多。) 为了回答你们的问题,我不认为这违反了关注点的分离。路由器不应该担心是什么控制器处理它的请求,或者更确切地说是控制器是如何产生的。它只需要知道,在某个时刻,即使是在404的情况下,一些控制器将处理它 现在在路由中注入一个控制器就可以了,然后你可以将其原型化为这样一个接口 public function di

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

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


为了回答你们的问题,我不认为这违反了关注点的分离。路由器不应该担心是什么控制器处理它的请求,或者更确切地说是控制器是如何产生的。它只需要知道,在某个时刻,即使是在404的情况下,一些控制器将处理它

现在在路由中注入一个控制器就可以了,然后你可以将其原型化为这样一个接口

public function dispatch(ControllerInterface $Controller){
   .....
}
否则,您必须进行大量的硬链接和依赖性,如果您需要第二个控制器怎么办

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

就我个人而言,我正在计划的一个项目的方法是使用一个事件驱动系统,在这个系统中,默认情况下会有一组控制器被分配,就像在传统的路由系统中一样(类/方法/参数…),比如说会搜索一个控制器文件夹。另一方面,控制器将注册自身以侦听特定的http请求。所以流量有点像这样

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

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


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

您为什么还要创建自己的MVC框架?从轻到重,有无数次解决了您的问题。我不打算创建一个复杂的框架,只是想创建一个简单的框架,以便更好地了解它们的工作原理。不要在路由器中实例化控制器。和+1,这是一个很好的学习方式(尽管@otanott绝对正确)。我正在构建自己的MVC框架,事实上我很快就要在GitHub上发布我的模板系统了,它被称为“Jet”,它也是一种标记化类型。现在大约完成了75%。它只是我正在构建的MVC、模板系统、CMS的一部分,我不希望CMS具有外部依赖性,因为我计划将该部分订阅为基础。
路由器
不是
调度程序
。感谢您的建议,我很感激。当然,这至少是一次很好的学习体验。我就是这么看的。
public function dispatch(ControllerInterface $Controller){
   .....
}