модули и язык в codeigniter 4 - PullRequest
0 голосов
/ 09 июля 2020

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

  • App
    • Config ..... до
    • Modules
      • Admin (внутри папки Admin будут контроллеры и просмотреть конфигурацию модели и язык)
        • Language
          • en
            • home. php
          • ар
            • дом. php

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

1 Ответ

0 голосов
/ 14 августа 2020

В настоящее время я тестирую этот фреймворк и хочу также создать модульное приложение, подобное 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
...