这就是我在需要的地方调用 Controller 的方式。
$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';
}
我所有的 Controller /类都有 命名空间 正如你在上面代码第 4 行看到的那样定义,它说
$namespace = 'App\Controller\\'
我只需要传递 Controller 的名称(HomeController、AboutController、UserController)来调用它们,效果很好。最近将所有 Controller (越来越多的 Controller 不断弹出)放在一个目录下变得很麻烦,所以我决定将它们移动到子目录中
App/Controller/Information
App/Controller/User
但是如果我开始将这些 Controller 移动到它们相应的目录中,命名空间也会发生变化。现在每个 Controller 都将在其命名空间中拥有其子目录名称(而不是所有 Controller 都具有相同的命名空间“App\Controller”)。
我现在如何在加载程序中动态包含命名空间(上面的代码),以前它只是一个命名空间完成所有工作?
如果我移动关于我们的信息,请联系我们,政策控制者位于
'App/Controller/Information'
命名空间从 App\Controller 更改为 App\Controller\Information。
最佳答案
“路由”...在我看来只有两种方式..
Controller
类(class)。 /contact-us/$Action/$OtherAction: App\Controller\Information\ContactUsController.php
. 然后您的内核可以检查路由是否匹配,如果没有继续正常处理(根据您的代码)或 404。
当然它需要一个额外的步骤来对你的 Controller 进行子分类,但它比猜测要理智得多
关于php - 动态添加命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59909301/