Nette Documentation Preview

syntax
Nette Bootstrap
***************

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

.[tip]
Если вы используете весь фреймворк, ничего больше делать не нужно. У вашего проекта есть подготовленный каталог `config/` для конфигурационных файлов, а их загрузкой занимается [загрузчик приложения |application:bootstrapping#Конфигурация DI-контейнера]. Эта статья для тех, кто использует только одну библиотеку Nette и хочет воспользоваться конфигурационными файлами.

Конфигурационные файлы обычно записываются в [формате NEON|neon:format], и лучше всего править их в [редакторах, которые его поддерживают |tools:ide]. Их можно понимать как указания, как **создавать и настраивать** объекты. Так что результатом загрузки конфигурации будет так называемая фабрика - объект, который по требованию создаёт другие объекты, которые вы хотите использовать. Например, соединение с базой данных и т. п.

Эту фабрику называют ещё *контейнером внедрения зависимостей* (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 задайте каталогу `temp/` [права на запись |nette:troubleshooting#Задание прав на каталоги].

Теперь перейдём к самим конфигурационным файлам. Мы загружаем их через `addConfig()`:

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

Если вы хотите добавить больше конфигурационных файлов, функцию `addConfig()` можно вызвать несколько раз. Если в файлах окажутся элементы с одинаковыми ключами, они будут перезаписаны (или [объединены |dependency-injection:configuration#Слияние] в случае массивов). Файл, добавленный позже, имеет более высокий приоритет, чем предыдущий.

Последний шаг - создание 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');
```

И теперь вы можете работать с базой данных!


Режим разработки и продакшн-режим
---------------------------------

В режиме разработки контейнер автоматически обновляется всякий раз, когда меняются конфигурационные файлы. В продакшн-режиме он порождается только один раз, и изменения не проверяются. Так что режим разработки нацелен на максимальное удобство программиста, а продакшн-режим - на производительность и боевое развёртывание.

Выбор режима выполняется автоопределением, так что обычно ничего настраивать и переключать вручную не нужно. Режим считается разработческим, если приложение запущено на localhost (то есть IP-адрес `127.0.0.1` или `::1`) и при этом нет прокси (то есть его HTTP-заголовка). Иначе работает продакшн-режим.

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

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

Мы настоятельно рекомендуем сочетать IP-адрес с cookie. В cookie `nette-debug` сохраните секретный токен, например `secret1234`. Так вы включите режим разработки для программистов, заходящих с определённого IP-адреса и имеющих в cookie этот токен:

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

Режим разработки можно и полностью отключить, даже для localhost:

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


Параметры
---------

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

Их можно вставить и снаружи методом `addDynamicParameters()`:

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

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


Если вы переходите на более новую версию, посмотрите страницу [обновления |upgrading].

Nette Bootstrap

Отдельные компоненты 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');

И теперь вы можете работать с базой данных!

Режим разработки и продакшн-режим

В режиме разработки контейнер автоматически обновляется всякий раз, когда меняются конфигурационные файлы. В продакшн-режиме он порождается только один раз, и изменения не проверяются. Так что режим разработки нацелен на максимальное удобство программиста, а продакшн-режим – на производительность и боевое развёртывание.

Выбор режима выполняется автоопределением, так что обычно ничего настраивать и переключать вручную не нужно. Режим считается разработческим, если приложение запущено на 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'],
]);

На параметр remoteIp можно сослаться в конфигурации записью %remoteIp%.

Если вы переходите на более новую версию, посмотрите страницу обновления.