модули и язык в codeigniter 4

предположим, что структура файлов следующая

  • App
    • Config ..... until
    • Modules
      • Admin (inside Admin folder will be controllers and views model config and language)
        • Language
          • en
            • home.php
          • ar
            • home.php

Итак, моя проблема заключается в том, что когда я хочу использовать функцию lang, я помещаю имя файла, а затем ключ того, что вы хотите получить. Поэтому, скажем, я вызвал функцию так, что lang('home.title') home представляет имя файла, а заголовок представляет ключ. Но он ничего не извлекает из файла и возвращает home.title, поэтому мне нужно поместить все мои файлы перевода в одну папку, которая находится внутри папки приложения? или есть решение?


person Ahmad Almosallam    schedule 09.07.2020    source источник
comment
было бы неплохо, если бы вы сказали нам, помог ли мой ответ   -  person Marco M    schedule 21.10.2020
comment
О, я только что заметил, что кто-то ответил на мой вопрос. Я благодарен вам за то, что вы ответили на мой вопрос. Я уже пропустил эту проблему, пытался найти какие-то решения, но ничего не нашел. Так что я просто пропустил это. Я не уверен, что ваш ответ является решением, но я очень благодарен за ответ на вопрос. Спасибо   -  person Ahmad Almosallam    schedule 22.10.2020


Ответы (2)


В настоящее время я тестирую эту структуру и хочу также создать модульное приложение, подобное HMVC. Я структурировал это, как вы, и наткнулся на тот же вопрос. Я просмотрел основной код и нашел проблему (пояснение в конце).

Предполагая, что пространство имен, например. контроллер в административном модуле будет выглядеть как \App\Modules\Admin\Controllers, а переменная $psr4 в вашем классе конфигурации автозагрузки выглядит как

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',
];

Если вы не хотите добавлять все пути вручную, вы можете определить конструктор вашего класса автозагрузки следующим образом:

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();
        }
    }
}

Проблема

Проблема заключается в том, что в процессе синтаксического анализа путь к языковым файлам несколько жестко запрограммирован и позже будет добавлен к одному из путей, известных автозагрузчику (например, к тем элементам в $psr4):

$path = "Language/{$locale}/{$file}.php"; // system\Language\Language.php line 314
...
$namespace['path'] . $path // system\Autoloader\FileLocator.php line 248
person Marco M    schedule 14.08.2020

Ну, не уверен, что это кому-то еще интересно, но я решил эту проблему, отладив некоторые классы 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',
];

Я ожидал, что фреймворк будет исследовать все каталоги внутри него, но я думаю, что он ограничен всего одним уровнем вниз.

Наконец, это моя структура каталогов:

  • приложение
  • публичный
  • система
  • доступный для записи
  • modules
    • admin
      • Controllers
      • Language
        • en
    • install
      • Controllers
      • Language
        • en
    • lobby
      • Controllers
      • Language
        • en

Итак, мой совет состоит в двух вещах:

  • Поместите свои модули вне папки приложения, как предлагает документация CI.
  • Явно сообщите CI, где находятся ваши модули.
person Lucas    schedule 29.10.2020
comment
Спасибо за ваш вклад. Это было выгодно - person Ahmad Almosallam; 31.10.2020