Как загрузить конфигурационный файл

Отдельные компоненты 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%.

версия: 3.x