В настоящее время я тестирую этот фреймворк и хочу также создать модульное приложение, подобное H MVC. Я структурировал его, как и вы, и наткнулся на тот же вопрос. Я изучил основной код и обнаружил проблему (объяснение в конце).
Предполагая, что пространство имен, например, для контроллера в модуле администратора будет выглядеть как «\ App \ Modules \ Admin \ Controllers» и переменная $ psr4 в вашем классе конфигурации Autoload выглядит как
public $psr4 = [
APP_NAMESPACE => APPPATH,
'Config' => APPPATH . 'Config',
'App' => APPPATH, // This might be missing
];
, вам просто нужно указать пространство имен и путь к модулю:
public $psr4 = [
APP_NAMESPACE => APPPATH,
'Config' => APPPATH . 'Config',
'App' => APPPATH, // This might be missing
'App\Modules\Admin' => APPPATH . 'Modules' . DIRECTORY_SEPARATOR . 'Admin',
];
Если вы не хотите добавлять все пути вручную вы можете определить конструктор вашего класса Autoload следующим образом:
public function __construct()
{
parent::__construct();
$dir = new DirectoryIterator(APPPATH . 'Modules');
foreach ($dir as $fileinfo) {
if ($fileinfo->isDir() && !$fileinfo->isDot()) {
$this->psr4['App\Modules\\' . $fileinfo->getFilename()] = $fileinfo->getRealPath();
}
}
}
Проблема
Проблема c заключается в том, что во время процесса синтаксического анализа путь к языковые файлы несколько жестко запрограммированы и позже будут добавлены к одному из путей, известных автозагрузчику (например, к этим элементам в $ psr4):
$path = "Language/{$locale}/{$file}.php"; // system\Language\Language.php line 314
...
$namespace['path'] . $path // system\Autoloader\FileLocator.php line 248