这就是我在需要的地方调用控制器的方式。
$file = 'App/Controller/' . $controller . '.php';
if (is_file($file)) {
include_once($file);
$namespace = 'App\Controller\\';
$relative_controller = $namespace . $controller;
$relative_controller = new $relative_controller();
if (is_callable(array($relative_controller, 'index'))) {
return call_user_func(array($relative_controller, 'index'));
} else {
echo 'Function not callable';
}
} else {
echo 'file missing';
}
我所有的控制器/类都定义了命名空间,如您在上面第4行的代码中看到的那样,它说$namespace = 'App\Controller\\'
,而我只需要传递控制器的名称(HomeController ,AboutController,UserController)调用它们,效果很好。
最近,将所有控制器(越来越多的控制器不断弹出)放在一个目录下变得很麻烦,所以我决定将它们移到类似的子目录中
App/Controller/Information
App/Controller/User
但是,如果我开始将这些控制器移至其相应的目录,则名称空间也会发生变化。现在,每个控制器将在其名称空间中有其子目录名称(而不是每个控制器都具有相同的名称空间“ App \ Controller”)。
我现在如何动态地将名称空间包含在加载器中(上面的代码),而以前它只是一个名称空间来完成所有工作?
如果我要移动关于我们的信息,请与我们联系,'App/Controller/Information'
下的策略控制者名称空间将从 App \ Controller 更改为 App \ Controller \ Information 。< / p>
答案 0 :(得分:0)
“路由” ...我看到的方式只有两种。
Controller
类的所有类来获得错误的控制器。 /contact-us/$Action/$OtherAction: App\Controller\Information\ContactUsController.php
。 然后,您的内核可以检查路由是否匹配,如果不能正常处理(按照您的代码)或404,则可以继续进行处理。
当然,仅需要对控制器进行子分类,就需要采取额外的步骤,但是比进行猜测要理智得多