不确定是否还有人感兴趣,但我通过调试 CodeIgniter 4 的一些类解决了这个问题。主要是BaseService::locator和FileLocator::search。
我注意到 CodeIgniter 正在寻找在其前面添加命名空间的语言路径,并循环遍历所有自动加载的目录和命名空间。
为了清楚起见,这是一个示例
/var/www/html/app/Config/Helpers/url_helper.php
/var/www/html/modules/admin/Helpers/url_helper.php
/var/www/html/modules/install/Helpers/url_helper.php
/var/www/html/modules/lobby/Helpers/url_helper.php
/var/www/html/system/Helpers/url_helper.php
/var/www/html/app/Config/Registrar.php
/var/www/html/app/Config/Config/Registrar.php
/var/www/html/modules/admin/Config/Registrar.php
/var/www/html/modules/install/Config/Registrar.php
/var/www/html/modules/lobby/Config/Registrar.php
/var/www/html/system/Config/Registrar.php
/var/www/html/app/Config/Events.php
/var/www/html/app/Config/Config/Events.php
/var/www/html/modules/admin/Config/Events.php
/var/www/html/modules/install/Config/Events.php
/var/www/html/modules/lobby/Config/Events.php
/var/www/html/system/Config/Events.php
/var/www/html/app/Config/Routes.php
/var/www/html/app/Config/Config/Routes.php
/var/www/html/modules/admin/Config/Routes.php
/var/www/html/modules/install/Config/Routes.php
/var/www/html/modules/lobby/Config/Routes.php
/var/www/html/system/Config/Routes.php
一旦我理解了正确的程序,我就能够正确地修改我的 app/Config/Autoload.php 文件。
这是它的样子
public $psr4 = [
APP_NAMESPACE => APPPATH, // For custom app namespace
'Config' => APPPATH . 'Config',
'Modules\Admin' => ROOTPATH . 'modules/admin',
'Modules\Game' => ROOTPATH . 'modules/install',
'Modules\Lobby' => ROOTPATH . 'modules/lobby',
];
在我这样做之后,将以下 URL 添加到上面的列表中
/var/www/html/app/Language/en/home/home_lang.php
/var/www/html/app/Config/Language/en/home/home_lang.php
/var/www/html/modules/admin/Language/en/home/home_lang.php
/var/www/html/modules/install/Language/en/home/home_lang.php
/var/www/html/modules/lobby/Language/en/home/home_lang.php
/var/www/html/system/Language/en/home/home_lang.php
我没有进一步探索,所以我不知道为什么 CodeIgniter 不考虑这样的事情:
public $psr4 = [
APP_NAMESPACE => APPPATH, // For custom app namespace
'Config' => APPPATH . 'Config',
'Modules' => ROOTPATH . 'modules',
];
我原以为框架会探索其中的所有目录,但我猜它仅限于向下一层。
最后,这是我的目录结构:
所以我的建议有两点:
- 按照 CI 文档的建议,将您的模块放在 app 文件夹之外。
- 明确告诉 CI 你的模块在哪里。