【发布时间】:2023-03-11 17:46:02
【问题描述】:
我正在努力提高我的编程技能,但遇到了一个令人沮丧的问题,最好用一个例子来解释:
假设我正在用 PHP 创建一个 microCMS。这个 microCMS 有一个 Router 类,负责路由。它还包含从中提取的 URI 和额外参数。
class Router{
private $uri;
private $params;
...
public function getRoute(){ ... }
...
public function getParams(){
return $this->params;
}
...
}
我还有一个前端控制器,我正在向它传递一个新的 Router() 对象。到目前为止,一切顺利,我可以访问前端控制器中的额外参数(通过$router->getParams();)。
class FrontController{
private $controller;
private $view;
public function __construct(Router $router){
$route = $router->getRoute();
...
$params = $router->getParams(); //Yay, I can get to the params here!
...
$this->view = new View($route->getModel());
...
}
现在这对我来说变得复杂了。这个 Front Controller 构造了一个 View。我希望这个视图也能够访问路由器的功能(例如,能够从中获取 URI 参数)。
class View{
public function output(){
//But how do I access the Router's params here...?
}
}
第一个也是最简单的解决方案似乎是将 Router 变成单例,或者只是将函数设为静态并简单地调用 Router::getParams()... 但这是不可以的,因为反模式。
第二种显而易见的解决方案是将我的路由器实例传递给视图的构造函数。我想避免这种情况,因为担心我的构造函数会在某个地方变得巨大。我不确定我需要像这样从 View 访问多少其他类,并且我不希望它们不必要地弄乱它的构造函数。这种恐惧有道理吗?
另一种解决方案是使用服务定位器并在我的视图中调用类似$serviceLocator->getRouter() 的东西。但这显然也是一种反模式。
那么解决方法是什么?还是我的 CMS 架构存在根本问题?
【问题讨论】:
标签: php dependency-injection singleton service-locator