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