Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IoC容器PHP路由_Php_Inversion Of Control_Url Routing - Fatal编程技术网

IoC容器PHP路由

IoC容器PHP路由,php,inversion-of-control,url-routing,Php,Inversion Of Control,Url Routing,我最近开始开发自己的MVC PHP应用程序。目前我正试图以一种我认为“干净”的方式来设置一切。经过一番阅读,我发现了IoC容器,并决定使用一个。我用奥林来做这个 现在我的路由器遇到了一个问题。在路由器中,我根据预定义的路由数据结构创建所需的模型、视图或控制器的对象。看起来是这样的: $this->routes["overview"] = new Route("AboutModel", "MainOverviewVie

我最近开始开发自己的MVC PHP应用程序。目前我正试图以一种我认为“干净”的方式来设置一切。经过一番阅读,我发现了IoC容器,并决定使用一个。我用奥林来做这个

现在我的路由器遇到了一个问题。在路由器中,我根据预定义的路由数据结构创建所需的模型、视图或控制器的对象。看起来是这样的:

$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();
我想我暂时会坚持这个解决方案(除非有人有更好的方法:-)