php - 动态添加命名空间

标签 php namespaces

这就是我在需要的地方调用 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 Controller类(class)。
  • 在 YML 或其他内容中设置路由方案:/contact-us/$Action/$OtherAction: App\Controller\Information\ContactUsController.php .

  • 然后您的内核可以检查路由是否匹配,如果没有继续正常处理(根据您的代码)或 404。

    当然它需要一个额外的步骤来对你的 Controller 进行子分类,但它比猜测要理智得多

    关于php - 动态添加命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59909301/

    相关文章:

    php - Laravel 命名空间,它是如何工作的?

    c# - 存储分层 Const 数据

    c# - 找不到类型或命名空间名称 'DefaultInlineConstraintResolver'

    javascript - 如何通过添加空格使所有文件名的长度相同?

    php - 从复选框设置 cookie 以跳过登陆页面

    php - 类循环依赖

    php - 个人项目: using while loops

    c++ - 友元声明阻止外部函数访问类的私有(private)部分

    php - 要在数据表中显示的 JSON 数据

    php - 来自 Windows 服务器的 mysql 在线仪表板