Я разделил логику своего приложения на несколько пакетов, и каждый из них инкапсулирует свои собственные файлы (представления, контроллеры, модели, ресурсы, миграции);все работает нормально, но у меня проблемы с переводами.
В AppServiceProvider каждого пакета я вызываю функцию loadJsonTranslationsFrom
и передаю путь, где находится файл перевода JSON, например,$this->loadJsonTranslationsFrom(__DIR__ . '/../../resources/lang')
.
Этот метод работает нормально после загрузки файла перевода JSON из основного проекта и одного из пакетов, но до этого функция не может загрузить остальные файлы.
После долгих поисков я решил отладить файлы фреймворка вручную, затем изменил файл vendor/laravel/framework/src/Illuminate/Translation/FileLoader.php
следующим образом:
В функции addJsonPath($path)
(строка 174) я добавил dump($this)
чтобы напечатать текущее состояние экземпляра загрузчика, после строки $this->jsonPaths[] = $path
(строка 176):
/**
* Add a new JSON path to the loader.
*
* @param string $path
* @return void
*/
public function addJsonPath($path)
{
$this->jsonPaths[] = $path;
dump($this);
}
В функции loadJsonPaths($locale)
(строка 139) я добавил dump('debug')
, чтобы проверить, когдаэта строка вызывается после самого начала функции:
/**
* Load a locale from the given JSON file path.
*
* @param string $locale
* @return array
*
* @throws \RuntimeException
*/
protected function loadJsonPaths($locale)
{
dump('debug');
return collect(array_merge($this->jsonPaths, [$this->path]))
...
}
После этих изменений я обнаружил, что функция loadJsonPaths
вызывается до того, как другие пакеты загрузят свои соответствующие переводы. Файлы, это вывод:
FileLoader {#164 ▼
#files: Filesystem {#156}
#path: "/home/user/Projects/html/myerp/resources/lang"
#jsonPaths: array:1 [▼
0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
]
#hints: []
}
"debug"
FileLoader {#164 ▼
#files: Filesystem {#156}
#path: "/home/user/Projects/html/myerp/resources/lang"
#jsonPaths: array:2 [▼
0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
1 => "/home/user/Projects/html/myerp/vendor/myerp/communications/src/Providers/../../resources/lang"
]
#hints: array:1 [▶]
}
FileLoader {#164 ▼
#files: Filesystem {#156}
#path: "/home/user/Projects/html/myerp/resources/lang"
#jsonPaths: array:3 [▼
0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
1 => "/home/user/Projects/html/myerp/vendor/myerp/communications/src/Providers/../../resources/lang"
2 => "/home/user/Projects/html/myerp/vendor/myerp/payments/src/Providers/../../resources/lang"
]
#hints: array:2 [▶]
}
FileLoader {#164 ▼
#files: Filesystem {#156}
#path: "/home/user/Projects/html/myerp/resources/lang"
#jsonPaths: array:3 [▼
0 => "/home/user/Projects/html/myerp/vendor/myerp/reports/src/Providers/../../resources/lang"
1 => "/home/user/Projects/html/myerp/vendor/myerp/communications/src/Providers/../../resources/lang"
2 => "/home/user/Projects/html/myerp/vendor/myerp/payments/src/Providers/../../resources/lang"
3 => "/home/user/Projects/html/myerp/vendor/myerp/persons/src/Providers/../../resources/lang"
]
#hints: array:2 [▶]
}
Как вы можете видеть, это поведение приводит к тому, что загружаются только файлы перевода JSON основного проекта и первого пакета.
Мои вопросыявляются:
Это правильное поведение? Как я могу переопределить это поведение и загрузить файлы перевода всех пакетов?
Я использую Laravel 5.7 поверх PHP 7.1
Надеюсь, вы могли бы помочь мне, заранее спасибо.