laravel чтение файлов конфигурации по требованию
laravel при загрузки читается сразу все файлы из /config/. Часть конфигурационных файлов нужна при определённых действиях которые выполняются отдельной задачей. В итоге получается так что он загружает всё подряд. А хотелось бы, чтобы загружал только необходимое, а остальные при первом запросе.
Т.е. например есть файлы:
/config/app.php
/config/database.php
/config/other.php
Хотелось бы чтобы laravel загрузил при bootstrap только:
/config/app.php
/config/database.php
а дополнительный файл конфигурации
/config/other.php
только если сделаю обращение:
config('other.name');
Laravel 8.83.27
Ответы (1 шт):
так это не работает к счастью/сожалению. Когда Вы заходите на страницу, то загружается index.php он делает все основные манипуляции для запуска ядра ларавель. То есть подгружает библиотеки (autoload), читает конфиги, формирует провайдеры и фасады из этих конфигов. формирует маршруты, консольные команды регистрирует и так далее и после собранные данные собираются в app.
получить который вы можете например так: app(). Там будет всё что касается вашего приложения на момент обращения к странице.
Далее выполняется ваш запрос. И это работает каждый релоад браузера. Так как после перезагрузки страницы память очищается и всё что было загружено удаляется из памяти сборщиком. Поэтому за этим не следим при разработке.
В процессе Runtime всё это не будет создаваться постоянно, а браться уже из существующих. Или использоваться singleton объекты, если где-то вызывается создание объекта который зарегистрирован как singleton.
Что касается Вашего вопроса. Для того чтобы чтение некоторых частей систем было быстрее в несколько раз. Например при получении конфигов есть config:cache и route:cache команда. В результате пусть у вас хоть 100 файлов конфигов будет создано, если они в кеше чтение их будет моментальное и что-то читать в определённый момент не имеет смысла. В качестве кеша можно использовать Redis например.
Если Вам принципиально именно такое поведение.
Можете сделать ваши конфиги в бд в таблице settings.
и свой хелпер db_config('other.name') где он будет обращаться к вашему сервису
SettingService, а он в свою очередь по требованию будет делать селект из бд и добавлять в массив $settings и если уже есть в массиве, то повторно не грузит. А конфиги ядра которые загружаются всегда(для каких-либо сервисов и библиотек) оставить как есть. В результаты вы можете ваши конфиге в админке редактировать их динамически
Пример
db_config('other.name') // вернет из вашей бд
db_config('database.connections') // вернёт конфиг из файловой системы (проверит массив, потом в бд и вызовет дефолтную функцию config('database.connections')