#php #module #codeigniter-4
Вопрос:
У меня есть проект, который я перепроектирую в codeigniter 4. Проект будет состоять из нескольких модулей, которые можно включать и выключать по мере необходимости. Для этого проекта мне нужны константы, которые загружаются и выводятся в соответствии с активными модулями в проекте.
То, что я ищу, — это лучший способ достичь этого. Я пытался и потерпел неудачу несколькими способами.
Сначала, чтобы проверить мою текущую настройку CI4
- Автоматическая загрузка модулей в Autoload.php конфигурационный файл
- Автоматическое обнаружение конфигурационных файлов в Modules.php конфигурационный файл
- Папка «Модули» находится рядом с папкой приложения. И папка состоит из вложенных папок, содержащих фактические модули. (пример: модули/Администратор и модули/Пользователи)
Я попытался добавить константы в Modules.php массив $псевдонимов. Но поскольку файл констант на самом деле не является файлом класса, он не загружается.
Я также попытался использовать следующий код внутри app/Config/Constants.php. И это работает для загрузки констант, но если бы я отключил модуль, эти константы все равно были бы загружены.
if (file_exists(ROOTPATH. 'modules')) {
$modulesPath = ROOTPATH.'modules/';
$modules = scandir($modulesPath);
foreach ($modules as $module) {
if ($module === '.' || $module === '..') continue;
if (is_dir($modulesPath) . '/' . $module) {
$constantsPath = $modulesPath . $module . '/Config/Constants.php';
if (file_exists($constantsPath)) {
require($constantsPath);
} else {
continue;
}
}
}
Любой совет или иной способ мышления будут высоко оценены.
Ответ №1:
Другой способ, который я бы предложил, — использовать пользовательскую конфигурацию в качестве службы в CI4.
Сначала создайте класс с методом, который вернет путь к модулям. Таким образом, это будет выглядеть следующим образом:
public class CustomConfiguration{
//returns module paths.
public function getActiveModulePaths(){
return [
'path1',
'path2'
];
}
}
Теперь, чтобы использовать этот CustomConfig в качестве службы в CI4, вам потребуется расширить службу CI4.
Поэтому по следующему пути app/Config/Services вам нужно будет создать отдельный элемент файла пользовательской конфигурации:
class Services extends CoreServices
{
public static function customConfig($getShared = true)
{
if ($getShared)
{
return static::getSharedInstance('customConfig');
}
return new CustomConfiguration();
}
}
Это гарантирует, что всякий раз, когда вы вызываете CustomConfiguration, он всегда будет возвращать один экземпляр класса пользовательской конфигурации.
Теперь всякий раз, когда вы хотите получить пути к своим активным модулям, вы можете просто вызвать следующее:
service('customConfig')->getActiveModulePaths()
Это вернет пути активных модулей.
Теперь для управления путями активного модуля в getActiveModulePaths вы можете либо использовать файл env для динамической выборки путей, либо задать его с помощью метода Setter или запроса к БД.
Ссылка : https://codeigniter4.github.io/userguide/concepts/services.html?выделить=услуга