Как загрузить файл конфигурации
Отдельные компоненты 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%
.