Як завантажити конфігураційний файл

Окремі компоненти Nette налаштовуються за допомогою конфігураційних файлів. Ми покажемо, як завантажувати ці файли.

Якщо ви використовуєте весь фреймворк, нічого додаткового робити не потрібно. У проекті є підготовлений каталог 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