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%.
Если вы переходите на более новую версию, посмотрите страницу обновления.