Nette Documentation Preview

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

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

.[tip]
Якщо ви використовуєте весь фреймворк, більше нічого робити не потрібно. У проєкті у вас є заздалегідь підготовлений каталог `config/` для файлів конфігурації, а за їхнє завантаження відповідає [завантажувач програми |application:bootstrap#DI-Container-Configuration].
Ця стаття призначена для користувачів, які використовують тільки одну бібліотеку Nette і хочуть скористатися перевагами конфігураційних файлів.

Файли конфігурації зазвичай пишуться у форматі [NEON |neon:format] і найкраще редагуються в [редакторах з його підтримкою |best-practices:editors-and-tools#IDE-Editor]. Їх можна розглядати як інструкції щодо **створення та конфігурування** об'єктів. Таким чином, результатом завантаження конфігурації буде так звана фабрика, що являє собою об'єкт, який на вимогу буде створювати інші об'єкти для подальшого використання. Наприклад, підключення до бази даних тощо.

Ця фабрика також називається *контейнером ін'єкції залежностей* (DI-контейнером), і якщо вас цікавлять подробиці, прочитайте главу [Впровадження залежностей |dependency-injection:].

Завантаженням конфігурації та створенням контейнера займається клас [api:Nette\Bootstrap\Configurator], тому спочатку ми встановимо його пакет `nette/bootstrap`:

```shell
composer require nette/bootstrap
```

І створіть екземпляр класу `Configurator`. Оскільки згенерований DI-контейнер буде кешуватися на диск, необхідно задати шлях до директорії, в якій він буде збережений:

```php
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
```

У Linux або macOS встановіть [дозвіл на запис |nette:troubleshooting#Setting-Directory-Permissions] для каталогу `temp/`.

І ми переходимо до самих конфігураційних файлів. Вони завантажуються за допомогою функції `addConfig()`:

```php
$configurator->addConfig(__DIR__ . '/database.neon');
```

Якщо ви хочете додати більше конфігураційних файлів, ви можете викликати функцію `addConfig()` кілька разів. Якщо у файлах з'являться елементи з однаковими ключами, вони будуть перезаписані (або [об'єднані |dependency-injection:configuration#Merging] у випадку з масивами). Пізніше доданий файл має вищий пріоритет, ніж попередній.

Останній крок - створення контейнера DI:

```php
$container = $configurator->createContainer();
```

А він уже створить для нас бажані об'єкти. Наприклад, якщо ви використовуєте конфігурацію для [Nette Database |database:configuration], ви можете попросити її створити з'єднання з базою даних:

```php
$db = $container->getByType(Nette\Database\Connection::class);
// або
$explorer = $container->getByType(Nette\Database\Explorer::class);
// або при створенні декількох з'єднань
$db = $container->getByName('database.main.connection');
```

І тепер ви можете працювати з базою даних!


Режим розробки та режим виробництва .[#toc-development-vs-production-mode]
--------------------------------------------------------------------------

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

Вибір режиму здійснюється шляхом автовизначення, тому зазвичай немає необхідності налаштовувати або перемикати що-небудь вручну. Режим розробки використовується, коли застосунок запущено на локальному хості (тобто IP-адресу `127.0.0.1` або `::1`) і відсутній проксі-сервер (тобто його HTTP-заголовок). В іншому разі застосунок працює у виробничому ("бойовому") режимі.

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

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

Ми безумовно рекомендуємо поєднувати IP-адресу з файлом кукі. Зберігайте секретний токен, наприклад, `secret1234`, у кукі `nette-debug`, і в такий спосіб ви ввімкнете режим розроблення для програмістів, які отримують доступ із певної IP-адреси і також мають токен, зазначений у кукі:

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

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

```php
$configurator->setDebugMode(false);
```


Параметри .[#toc-parameters]
----------------------------

Ви також можете використовувати параметри в конфігураційних файлах, які визначаються [в розділі `параметры`. |dependency-injection:configuration#Parameters]

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

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

На параметр `projectId` можна посилатися в конфігурації за допомогою нотації `%projectId%`.


{{leftbar: nette:@menu-topics}}

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

Окремі компоненти 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%.