IoC容器PHP路由
我最近开始开发自己的MVC PHP应用程序。目前我正试图以一种我认为“干净”的方式来设置一切。经过一番阅读,我发现了IoC容器,并决定使用一个。我用奥林来做这个 现在我的路由器遇到了一个问题。在路由器中,我根据预定义的路由数据结构创建所需的模型、视图或控制器的对象。看起来是这样的:IoC容器PHP路由,php,inversion-of-control,url-routing,Php,Inversion Of Control,Url Routing,我最近开始开发自己的MVC PHP应用程序。目前我正试图以一种我认为“干净”的方式来设置一切。经过一番阅读,我发现了IoC容器,并决定使用一个。我用奥林来做这个 现在我的路由器遇到了一个问题。在路由器中,我根据预定义的路由数据结构创建所需的模型、视图或控制器的对象。看起来是这样的: $this->routes["overview"] = new Route("AboutModel", "MainOverviewVie
$this->routes["overview"] = new Route("AboutModel",
"MainOverviewView",
"MainOverviewController");
$routeName = isset($_GET['route']) ? $_GET['route'] : "";
$router = $injector->make("Router");
$componentNames = $router->getRoute($routeName);
$frontController = $injector->make("FrontController");
$frontController->setController($injector->make($componentNames->controller));
$frontController->setView($injector->make($componentNames->view));
echo $frontController->output();
此数组中定义的名称基本上是类名。应该为路线“概述”实例化这些类。稍后在我的FrontController的_construct()中,我执行以下操作来创建我的类:
public function __construct(Router $router, $routeName = "", $action = null) {
$route = $router->getRoute($routeName);
$model = new $route->model;
$this->controller = new $route->controller($model);
$this->view = new $route->view($model, $routeName);
if (!empty($action)) {
$this->controller->{$action}();
}
}
$route->model会给出我必须为该路由初始化的确切模型类的名称。因此,当坚持概述路线时,这会给我$model=newaboutmodel(不要介意那些只是乱弄的名字)。
这似乎是我应该使用IoC容器来做的事情,因此我宁愿让IoC容器创建我需要的对象
但是容器如何知道我需要它创建哪些类呢
因此,我正在寻找一种方法,以某种方式使用IoC容器动态创建所需的控制器、视图和模型。
我对此做了一些研究,并找到了一个“解决方案”,即将IoC容器传递给FrontController的构造函数。我不认为这是正确的做法,因为我认为我的对象不应该知道我的IoC容器
有没有一种“漂亮”的方式来完成我想完成的事情
如果有任何不清楚的地方,请询问!谢谢大家!
编辑:解决方法
我已经为这个问题创建了一个解决方案。我现在不是在FrontPatterns构造函数中包含所有这些参数,而是通过set方法传递所需的控制器和视图
这会生成一些初始化代码,用户每次更改站点时都会运行这些代码。我将所有这些都放在index.php文件中,它如下所示:
$this->routes["overview"] = new Route("AboutModel",
"MainOverviewView",
"MainOverviewController");
$routeName = isset($_GET['route']) ? $_GET['route'] : "";
$router = $injector->make("Router");
$componentNames = $router->getRoute($routeName);
$frontController = $injector->make("FrontController");
$frontController->setController($injector->make($componentNames->controller));
$frontController->setView($injector->make($componentNames->view));
echo $frontController->output();
我想我暂时会坚持这个解决方案(除非有人有更好的方法:-)