动态添加名称空间

时间:2020-01-25 12:39:36

标签: php namespaces

这就是我在需要的地方调用控制器的方式。

$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>

1 个答案:

答案 0 :(得分:0)

“路由” ...我看到的方式只有两种。

  • 进行猜测,并通过找到扩展基本Controller类的所有类来获得错误的控制器。
  • 使用YML或其他方式设置路由方案:/contact-us/$Action/$OtherAction: App\Controller\Information\ContactUsController.php

然后,您的内核可以检查路由是否匹配,如果不能正常处理(按照您的代码)或404,则可以继续进行处理。

当然,仅需要对控制器进行子分类,就需要采取额外的步骤,但是比进行猜测要理智得多