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%.