在 PHP 中使用 MVC 苦苦挣扎。看完后我的担忧变得更大: https ://www.youtube.com/watch?v=RlfLCWKxHJ0
根据 LoD,我的路由器类应该只知道请求 Uri 以加载正确的控制器类。但是,我的 Conroller 应该知道它应该使用哪个 Model 类以及一个 View 类来呈现数据。或者更好的是,Controller 应该知道 ModelFactory 将使用选定的数据存储来处理对象创建。
这一切都打破了我的 LoD。
所以我的问题是:
- 路由器应该如何初始化控制器类而不知道它需要哪些参数?即使是 DI 容器,我们也不知道要传递给 Router 内部构造函数的对象参数。如果我们将 DI 容器传递给 Router 构造函数(或任何其他类),我们将返回到 Service Locator。这应该怎么做?
也许这都是错误的,但我的出发点是:
// ... retrieve settings, available languages, start session,...
$router = new Router($settings);
$router->loadController();
路由器.php
class Router
{
public function __construct(Settings $settings)
{
$this->settings = $settings;
}
// some other methods
public function loadController()
{
try
{
// Loading controller
$controller = $this->getController();
if (is_callable(array($controller, $this->method)) == false)
$this->method = 'init';
// Running controller
$controller->{$this->method}();
}
catch (Exception $e)
{
$e->displayMessage();
}
}
}
从这里开始,我在 Controller 类中什么都做不了,因为我需要调用new Model,new View并且必须在构造函数或方法中显式地执行它,这很糟糕。
更多问题:
- 我应该如何在 Controller 中获取 Model 类的实例?我应该使用静态方法加载视图吗?