【问题标题】:How to auto load controllers with different sub-namespaces?如何自动加载具有不同子命名空间的控制器?
【发布时间】:2017-11-14 08:32:25
【问题描述】:

这是我项目的部分结构

root  
  |-App
     |--Controller
          |--Common
               |-HomeController.php
               |-HeaderController.php
               |-FooterController.php
               |-SidebarController.php
           |--Info
               |-AboutController.php
               |-ContactController.php

为了更好地管理,我将控制器放置在相应的目录中。

我最近为它们添加了命名空间。

HomeController.php = namespace app\controller\common; 
HeaderController.php = namespace app\controller\common;

AboutController.php = namespace app\controller\info; 
ContactController.php = namespace app\controller\info;

要加载这些控制器,我在下面检查这个自动加载器

spl_autoload_register(function ($class) {

    $prefix = 'app\controller\common\\';
    $base_dir = __DIR__ . '/app/controller/common/'; // your classes folder

    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        return;
    }
    $relative_class = substr($class, $len);
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
    if (file_exists($file)) {
        require $file;
    }
});

$home = new app\controller\common\HomeController();
$home->index();

它可以工作,即它会自动加载文件夹 app > controller > common 中的所有控制器。

问题是我不明白如何加载位于不同文件夹(如 Info 文件夹中的那些)和不同子命名空间(命名空间 app\controller\info、命名空间 app\controller\client 的所有其他控制器)的所有其他控制器)?

自动加载的命名空间前缀定义为$prefix = 'app\controller\common\\';,我想这是我需要解决的问题,以适应加载它们的所有其他控制器。

如何修复这个 $prefix?

【问题讨论】:

  • 老实说,我建议只使用Composer。它包含您需要的东西以及更多功能,适用于任何平台,易于理解且非常便携。

标签: php namespaces


【解决方案1】:

你的想法是对的。但是您选择了匿名函数,这本身并不一定是错误的,只是不太适合您当前的案例问题。你最好使用常规函数。

你可以这样做:

spl_autoload_register('myAutoloader');

function myAutoloader($path) {
    foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path),\FilesystemIterator::SKIP_DOTS) as $file) {
        if ($file->getFileExtension() == 'php') {
            require $file->getFilename() . $file->getFileExtension();
        }
    }
}

这个函数将递归遍历一个文件夹和require它找到的任何php文件。它不会处理各种依赖关系,因此请记住这一点。

spl_autoload_register() 允许您注册多个函数(或来自您自己的 Autoload 类的静态方法),PHP 将把这些函数放入堆栈/队列并在声明“新类”时按顺序调用。

引用来自this问题,我强烈建议您阅读。


话虽如此,我鼓励您使用Composer。它专为您的确切问题而设计。你可以用它加载任何东西。不仅仅是 php 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2016-11-30
    • 2020-01-11
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多