Codeigniter 4 модуля константы загрузки

#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?выделить=услуга