如何自动加载具有不同子命名空间的控制器?

时间:2017-11-14 08:32:26

标签: php namespaces

这是我项目的部分结构

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();

它可以工作,即它自动加载文件夹应用程序中的所有控制器>控制器>共同。

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

autoload的名称空间前缀定义为$prefix = 'app\controller\common\\';,我想这是我需要修复以容纳所有其他控制器来加载它们。

如何修复此$前缀?

1 个答案:

答案 0 :(得分: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()允许您注册PHP将放入堆栈/队列的多个函数(或来自您自己的Autoload类的静态方法),并在声明“new Class”时按顺序调用。

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

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