Nette Documentation Preview

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

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

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

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

Эта фабрика также называется *контейнером внедрения зависимостей* (DI container), и если вас интересуют подробности, прочитайте главу о [внедрении зависимостей |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');
```

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


Режим разработки vs production
------------------------------

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

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

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

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


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

Nette Bootstrap

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

Если вы используете весь фреймворк, вам не нужно ничего делать. В проекте у вас есть подготовленный каталог config/ для конфигурационных файлов, и их загрузкой занимается загрузчик приложения. Эта статья предназначена для пользователей, которые используют только одну библиотеку Nette и хотят воспользоваться возможностями конфигурационных файлов.

Конфигурационные файлы обычно пишутся в формате NEON и лучше всего редактируются в редакторах с его поддержкой. Их можно рассматривать как инструкции по созданию и настройке объектов. Таким образом, результатом загрузки конфигурации будет так называемая фабрика, то есть объект, который по запросу создаст для нас другие объекты, которые мы хотим использовать. Например, соединение с базой данных и т. д.

Эта фабрика также называется контейнером внедрения зависимостей (DI container), и если вас интересуют подробности, прочитайте главу о внедрении зависимостей.

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

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

Режим разработки vs production

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

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

Если мы хотим включить режим разработки и в других случаях, например, для программистов, обращающихся с определенного 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%.