Как да заредим конфигурационен файл

Настройваме отделните компоненти на Nette с помощта на конфигурационни файлове. Ще ви покажем как да зареждате тези файлове.

Ако използвате целия framework, не е необходимо да правите нищо повече. В проекта имате подготвена директория config/ за конфигурационните файлове и зареждането им се управлява от зареждащото устройство на приложението. Тази статия е за потребители, които използват само една библиотека на Nette и искат да използват възможностите на конфигурационните файлове.

Конфигурационните файлове обикновено се записват във формат NEON и най-добре се редактират в редактори с неговата поддръжка. Могат да се разглеждат като ръководства за създаване и конфигуриране на обекти. Следователно, резултатът от зареждането на конфигурацията ще бъде така наречената фабрика, която е обект, който по заявка ще ни създаде други обекти, които искаме да използваме. Например връзка с база данни и т.н.

Тази фабрика се нарича още dependency injection контейнер (DI container) и ако се интересувате от подробности, прочетете главата за dependency injection.

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

Параметърът projectId може да бъде рефериран в конфигурацията чрез запис %projectId%.

версия: 3.x