Nette Bootstrap

Отдельные компоненты Nette настраиваются через конфигурационные файлы. Мы покажем, как эти файлы загрузить.

Если вы используете весь фреймворк, ничего больше делать не нужно. У вашего проекта есть подготовленный каталог config/ для конфигурационных файлов, а их загрузкой занимается загрузчик приложения. Эта статья для тех, кто использует только одну библиотеку Nette и хочет воспользоваться конфигурационными файлами.

Конфигурационные файлы обычно записываются в формате NEON, и лучше всего править их в редакторах, которые его поддерживают. Их можно понимать как указания, как создавать и настраивать объекты. Так что результатом загрузки конфигурации будет так называемая фабрика – объект, который по требованию создаёт другие объекты, которые вы хотите использовать. Например, соединение с базой данных и т. п.

Эту фабрику называют ещё контейнером внедрения зависимостей (DI-контейнером), и если вас интересуют подробности, прочитайте главу о внедрении зависимостей.

Загрузкой конфигурации и созданием контейнера занимается класс 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');

И теперь вы можете работать с базой данных!

Режим разработки и продакшн-режим

В режиме разработки контейнер автоматически обновляется всякий раз, когда меняются конфигурационные файлы. В продакшн-режиме он порождается только один раз, и изменения не проверяются. Так что режим разработки нацелен на максимальное удобство программиста, а продакшн-режим – на производительность и боевое развёртывание.

Выбор режима выполняется автоопределением, так что обычно ничего настраивать и переключать вручную не нужно. Режим считается разработческим, если приложение запущено на localhost (то есть IP-адрес 127.0.0.1 или ::1) и при этом нет прокси (то есть его HTTP-заголовка). Иначе работает продакшн-режим.

Если мы хотим включить режим разработки и в других случаях, например для программистов, заходящих с определённого 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'],
]);

На параметр remoteIp можно сослаться в конфигурации записью %remoteIp%.

Если вы переходите на более новую версию, посмотрите страницу обновления.

версия: 3.x