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

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

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

Режим разработки и режим производства

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

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

Если вы хотите включить режим разработки в других случаях, например, когда программисты получают доступ с определенного IP-адреса, используйте setDebugMode():

$configurator->setDebugMode('23.75.345.200');
// также может быть указан массив IP-адресов

Мы определенно рекомендуем сочетать IP-адрес с файлом куки. Храните секретный токен, например, secret1234, в куки nette-debug, и таким образом вы включите режим разработки для программистов, получающих доступ с определенного IP-адреса и также имеющих токен, указанный в куки:

$configurator->setDebugMode('secret1234@23.75.345.200');

Вы также можете полностью отключить режим разработчика, даже для localhost:

$configurator->setDebugMode(false);

Параметры

Вы также можете использовать параметры в конфигурационных файлах, которые определяются в разделе параметры.

Они также могут быть вставлены извне с помощью метода addDynamicParameters():

$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);

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

версия: 3.x