Nette Documentation Preview

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

.[perex]
Настройваме отделните компоненти на Nette с помощта на конфигурационни файлове. Ще ви покажем как да зареждате тези файлове.

.[tip]
Ако използвате целия framework, не е необходимо да правите нищо повече. В проекта имате подготвена директория `config/` за конфигурационните файлове и зареждането им се управлява от [зареждащото устройство на приложението |application:bootstrapping#Конфигурация на DI контейнера]. Тази статия е за потребители, които използват само една библиотека на Nette и искат да използват възможностите на конфигурационните файлове.

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

Тази фабрика се нарича още *dependency injection контейнер* (DI container) и ако се интересувате от подробности, прочетете главата за [dependency injection |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'],
]);
```

Параметърът `projectId` може да бъде рефериран в конфигурацията чрез запис `%projectId%`.


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

Nette Bootstrap

Настройваме отделните компоненти на Nette с помощта на конфигурационни файлове. Ще ви покажем как да зареждате тези файлове.

Ако използвате целия framework, не е необходимо да правите нищо повече. В проекта имате подготвена директория 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%.