Как загрузить конфигурационный файл
Отдельные компоненты Nette настраиваются с помощью конфигурационных файлов. Мы покажем вам, как загружать эти файлы.
Если вы используете весь фреймворк, вам не нужно ничего делать.
В проекте у вас есть подготовленный каталог config/
для
конфигурационных файлов, и их загрузкой занимается загрузчик приложения.
Эта статья предназначена для пользователей, которые используют только
одну библиотеку Nette и хотят воспользоваться возможностями
конфигурационных файлов.
Конфигурационные файлы обычно пишутся в формате NEON и лучше всего редактируются в редакторах с его поддержкой. Их можно рассматривать как инструкции по созданию и настройке объектов. Таким образом, результатом загрузки конфигурации будет так называемая фабрика, то есть объект, который по запросу создаст для нас другие объекты, которые мы хотим использовать. Например, соединение с базой данных и т. д.
Эта фабрика также называется контейнером внедрения зависимостей (DI container), и если вас интересуют подробности, прочитайте главу о внедрении зависимостей.
Загрузку конфигурации и создание контейнера выполняет класс Nette\Bootstrap\Configurator, поэтому
сначала установим его пакет nette/bootstrap
:
composer require nette/bootstrap
И создадим экземпляр класса Configurator
. Поскольку
сгенерированный DI-контейнер будет кешироваться на диск, необходимо
указать путь к каталогу, где он будет храниться:
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
В Linux или macOS установите для каталога temp/
права на запись.
И мы подходим к самим конфигурационным файлам. Мы загружаем их с
помощью addConfig()
:
$configurator->addConfig(__DIR__ . '/database.neon');
Если мы хотим добавить несколько конфигурационных файлов, мы можем
вызвать функцию addConfig()
несколько раз. Если в файлах появятся
элементы с одинаковыми ключами, они будут перезаписаны (или в случае
массивов объединены).
Файл, вставленный позже, имеет более высокий приоритет, чем
предыдущий.
Последний шаг — создание DI-контейнера:
$container = $configurator->createContainer();
И он уже создаст для нас нужные объекты. Например, если вы используете конфигурацию для Nette Database, вы можете попросить его создать соединения с базой данных:
$db = $container->getByType(Nette\Database\Connection::class);
// или
$explorer = $container->getByType(Nette\Database\Explorer::class);
// или при создании нескольких соединений
$db = $container->getByName('database.main.connection');
И теперь вы можете работать с базой данных!
Режим разработки vs production
В режиме разработки контейнер автоматически обновляется при каждом изменении конфигурационных файлов. В production-режиме он генерируется только один раз, и изменения не проверяются. Таким образом, режим разработки ориентирован на максимальное удобство программиста, а production — на производительность и развертывание.
Выбор режима осуществляется автоматически, поэтому обычно нет
необходимости что-либо настраивать или переключать вручную. Режим
является режимом разработки, если приложение запущено на localhost (т. е.
IP-адрес 127.0.0.1
или ::1
) и отсутствует прокси (т. е. его
HTTP-заголовок). В противном случае оно работает в production-режиме.
Если мы хотим включить режим разработки и в других случаях, например,
для программистов, обращающихся с определенного IP-адреса, мы
используем setDebugMode()
:
$configurator->setDebugMode('23.75.345.200');
// можно также указать массив IP-адресов
Мы настоятельно рекомендуем сочетать IP-адрес с cookie. В cookie
nette-debug
мы сохраняем секретный токен, например, secret1234
, и
таким образом активируем режим разработки для программистов,
обращающихся с определенного IP-адреса и одновременно имеющих
указанный токен в cookie:
$configurator->setDebugMode('secret1234@23.75.345.200');
Мы также можем полностью отключить режим разработки, даже для localhost:
$configurator->setDebugMode(false);
Параметры
В конфигурационных файлах вы также можете использовать параметры,
которые определяются в
разделе parameters
.
Их также можно вставлять извне с помощью метода
addDynamicParameters()
:
$configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
На параметр projectId
можно ссылаться в конфигурации с помощью
записи %projectId%
.