gpt4 book ai didi

php - 如何自动加载具有不同子命名空间的 Controller ?

转载 作者:行者123 更新时间:2023-12-04 17:02:02 25 4
gpt4 key购买 nike

这是我的项目的部分结构

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

我将我的 Controller 放在相应的目录中以便更好地管理。

我最近为它们添加了命名空间。
HomeController.php = namespace app\controller\common; 
HeaderController.php = namespace app\controller\common;

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

要加载这些 Controller ,我正在检查下面的自动加载器
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();

它可以工作,即它会自动加载文件夹应用程序> Controller > 通用中的所有 Controller 。

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

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

我该如何修复这个 $prefix?

最佳答案

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

你可以这样做:

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() allows you to register multiple functions (or static methods from your own Autoload class) that PHP will put into a stack/queue and call sequentially when a "new Class" is declared.



报价来自 this问题,我强烈建议您阅读。

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

关于php - 如何自动加载具有不同子命名空间的 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47280994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com