Nette Documentation Preview

syntax
Конфигурация приложения
***********************

.[perex]
Обзор параметров конфигурации Nette Application.


Application
===========

```neon
application:
	# показывать панель "Nette Application" в Tracy BlueScreen?
	debugger: ...           # (bool) включено при наличии Tracy

	# в продакшене исключения всегда обрабатывает error-презентер;
	# этот параметр лишь включает такое поведение и в режиме разработки
	catchExceptions: ...    # (bool) по умолчанию false, то есть выключено в dev, всегда включено в продакшене

	# имя error-презентера
	errorPresenter: Error   # (string|array) по умолчанию 'Nette:Error'

	# задаёт псевдонимы презентеров и действий
	aliases: ...

	# задаёт правила преобразования имени презентера в класс
	mapping: ...

	# подавлять предупреждения о некорректных ссылках?
	# действует только в режиме разработки
	silentLinks: ...        # (bool) по умолчанию false
```

Начиная с версии `nette/application` 3.2 можно задать пару error-презентеров:

```neon
application:
	errorPresenter:
		4xx: Error4xx   # для Nette\Application\BadRequestException
		5xx: Error5xx   # для остальных исключений
```

Разделять их полезно, потому что эти две ситуации принципиально различны. `BadRequestException` (коды 4xx) означает, что с приложением всё в порядке и просто посетитель запросил то, чего не существует. Поэтому вы можете использовать полноценный презентер, показывающий дружелюбное сообщение в макете вашего сайта. Напротив, ошибка 5xx означает, что в приложении что-то сломалось и вы не знаете что. Держите презентер для 5xx максимально простым, чтобы при его отрисовке уже ничто не могло отказать: в идеале он не должен трогать ни базу данных, ни макет, ни вошедшего пользователя.

Параметр `silentLinks` определяет, как ведёт себя Nette в режиме разработки, когда порождение ссылки не удаётся (например, потому что презентера не существует). Значение по умолчанию `false` означает, что Nette выдаёт ошибку `E_USER_WARNING`. Значение `true` подавляет это сообщение. В производственной среде `E_USER_WARNING` выдаётся всегда. На это поведение можно повлиять и переменной презентера [$invalidLinkMode |creating-links#Некорректные ссылки].

[Псевдонимы упрощают обращение |creating-links#Псевдонимы] к часто используемым презентерам.

[Mapping задаёт правила |directory-structure#Отображение презентеров], по которым имя класса выводится из имени презентера.


Автоматическая регистрация презентеров
--------------------------------------

Nette автоматически добавляет презентеры как сервисы в DI-контейнер, что заметно ускоряет их создание. То, как Nette находит презентеры, можно настроить:

```neon
application:
	# искать презентеры в class map Composer?
	scanComposer: ...      # (bool) по умолчанию true

	# маска, которой должны соответствовать имя класса и имя файла
	scanFilter: ...        # (string) по умолчанию '*Presenter'

	# в каких каталогах искать презентеры?
	scanDirs:              # (string[]|false) по умолчанию '%appDir%'
		- %vendorDir%/mymodule
```

Каталоги, перечисленные в `scanDirs`, не заменяют значение по умолчанию `%appDir%`, а дополняют его, поэтому в `scanDirs` окажутся оба пути: `%appDir%` и `%vendorDir%/mymodule`. Если мы хотим обойтись без каталога по умолчанию, мы используем [восклицательный знак |dependency-injection:configuration#Слияние]:

```neon
application:
	scanDirs!:
		- %vendorDir%/mymodule
```

Сканирование каталогов можно отключить значением `false`. Тогда презентеры больше не регистрируются как сервисы, поэтому их нельзя настроить через секцию [decorator |dependency-injection:configuration#Decorator], а их создание идёт медленнее. Поэтому мы не рекомендуем полностью отключать автоматическую регистрацию: это снизит производительность приложения.


Шаблоны Latte
=============

Эта настройка глобально влияет на поведение Latte в компонентах и презентерах.

```neon
latte:
	# показывать панель Latte в Tracy Bar для главного шаблона (true) или для всех компонентов (all)?
	debugger: ...        # (true|false|'all') включено при наличии Tracy (только в режиме отладки)

	# порождать шаблоны с заголовком declare(strict_types=1)
	strictTypes: ...     # (bool) по умолчанию false

	# включить [строгий режим разбора |latte:develop#strict mode]
	strictParsing: ...   # (bool) по умолчанию false

	# ограничивает область видимости переменных телом цикла
	scopedLoopVariables: ... # (bool) по умолчанию false

	# убирает отступы, возникающие из-за вложенности в парные теги
	dedent: ...          # (bool) по умолчанию false

	# включить [проверку порождённого кода |latte:develop#Checking Generated Code]
	phpLinter: ...       # (string) по умолчанию null

	# задать локаль
	locale: cs_CZ        # (string) по умолчанию null

	# класс объекта $this->template
	templateClass: App\MyTemplateClass # по умолчанию Nette\Bridges\ApplicationLatte\DefaultTemplate
```

Новые [расширения |latte:extending-latte#Расширение Latte] добавляются так:

```neon
latte:
	extensions:
		- Latte\Essential\TranslatorExtension(@Nette\Localization\Translator)
```


Маршрутизация
=============

Основные настройки:

```neon
routing:
	# показывать панель маршрутизации в Tracy Bar?
	debugger: ...   # (bool) включено при наличии Tracy (только в режиме отладки)

	# сериализовать маршрутизатор в DI-контейнер
	cache: ...      # (bool) по умолчанию false
```

Маршрутизация обычно задаётся в классе [RouterFactory |routing#Набор маршрутов]. Как вариант, маршруты можно задать и в конфигурации парами `маска: действие`, но такой способ не даёт большой гибкости:

```neon
routing:
	routes:
		'detail/<id>': Admin:Home:default
		'<presenter>/<action>': Front:Home:default
```


Константы
=========

Создание констант PHP.

```neon
constants:
	Foobar: 'baz'
```

Константа `Foobar` будет создана после старта приложения.

.[note]
Константы не должны служить глобально доступными переменными. Для передачи значений объектам используйте [внедрение зависимостей |dependency-injection:passing-dependencies].


PHP
===

Настройка директив PHP. Обзор всех директив есть на [php.net |https://www.php.net/manual/en/ini.list.php].

```neon
php:
	date.timezone: Europe/Prague
```


Сервисы DI
==========

Эти сервисы добавляются в DI-контейнер:

| Имя                        | Тип                                               | Описание
|----------------------------|---------------------------------------------------|-----------------------------------------
| `application.application`	 | [api:Nette\Application\Application]               | [запускающий модуль приложения |how-it-works#Nette Application]
| `application.linkGenerator`  | [api:Nette\Application\LinkGenerator]             | [LinkGenerator |creating-links#LinkGenerator]
| `application.presenterFactory` | [api:Nette\Application\IPresenterFactory]         | фабрика презентеров
| `application.###`          | [api:Nette\Application\UI\Presenter]              | отдельные презентеры
| `routing.router`           | [api:Nette\Routing\Router]                        | маршрутизатор
| `latte.latteFactory`       | [api:Nette\Bridges\ApplicationLatte\LatteFactory] | фабрика объекта `Latte\Engine`
| `latte.templateFactory`    | [api:Nette\Application\UI\TemplateFactory]        | фабрика [`$this->template` |templates]

Конфигурация приложения

Обзор параметров конфигурации Nette Application.

Application

application:
	# показывать панель "Nette Application" в Tracy BlueScreen?
	debugger: ...           # (bool) включено при наличии Tracy

	# в продакшене исключения всегда обрабатывает error-презентер;
	# этот параметр лишь включает такое поведение и в режиме разработки
	catchExceptions: ...    # (bool) по умолчанию false, то есть выключено в dev, всегда включено в продакшене

	# имя error-презентера
	errorPresenter: Error   # (string|array) по умолчанию 'Nette:Error'

	# задаёт псевдонимы презентеров и действий
	aliases: ...

	# задаёт правила преобразования имени презентера в класс
	mapping: ...

	# подавлять предупреждения о некорректных ссылках?
	# действует только в режиме разработки
	silentLinks: ...        # (bool) по умолчанию false

Начиная с версии nette/application 3.2 можно задать пару error-презентеров:

application:
	errorPresenter:
		4xx: Error4xx   # для Nette\Application\BadRequestException
		5xx: Error5xx   # для остальных исключений

Разделять их полезно, потому что эти две ситуации принципиально различны. BadRequestException (коды 4xx) означает, что с приложением всё в порядке и просто посетитель запросил то, чего не существует. Поэтому вы можете использовать полноценный презентер, показывающий дружелюбное сообщение в макете вашего сайта. Напротив, ошибка 5xx означает, что в приложении что-то сломалось и вы не знаете что. Держите презентер для 5xx максимально простым, чтобы при его отрисовке уже ничто не могло отказать: в идеале он не должен трогать ни базу данных, ни макет, ни вошедшего пользователя.

Параметр silentLinks определяет, как ведёт себя Nette в режиме разработки, когда порождение ссылки не удаётся (например, потому что презентера не существует). Значение по умолчанию false означает, что Nette выдаёт ошибку E_USER_WARNING. Значение true подавляет это сообщение. В производственной среде E_USER_WARNING выдаётся всегда. На это поведение можно повлиять и переменной презентера $invalidLinkMode.

Псевдонимы упрощают обращение к часто используемым презентерам.

Mapping задаёт правила, по которым имя класса выводится из имени презентера.

Автоматическая регистрация презентеров

Nette автоматически добавляет презентеры как сервисы в DI-контейнер, что заметно ускоряет их создание. То, как Nette находит презентеры, можно настроить:

application:
	# искать презентеры в class map Composer?
	scanComposer: ...      # (bool) по умолчанию true

	# маска, которой должны соответствовать имя класса и имя файла
	scanFilter: ...        # (string) по умолчанию '*Presenter'

	# в каких каталогах искать презентеры?
	scanDirs:              # (string[]|false) по умолчанию '%appDir%'
		- %vendorDir%/mymodule

Каталоги, перечисленные в scanDirs, не заменяют значение по умолчанию %appDir%, а дополняют его, поэтому в scanDirs окажутся оба пути: %appDir% и %vendorDir%/mymodule. Если мы хотим обойтись без каталога по умолчанию, мы используем восклицательный знак:

application:
	scanDirs!:
		- %vendorDir%/mymodule

Сканирование каталогов можно отключить значением false. Тогда презентеры больше не регистрируются как сервисы, поэтому их нельзя настроить через секцию decorator, а их создание идёт медленнее. Поэтому мы не рекомендуем полностью отключать автоматическую регистрацию: это снизит производительность приложения.

Шаблоны Latte

Эта настройка глобально влияет на поведение Latte в компонентах и презентерах.

latte:
	# показывать панель Latte в Tracy Bar для главного шаблона (true) или для всех компонентов (all)?
	debugger: ...        # (true|false|'all') включено при наличии Tracy (только в режиме отладки)

	# порождать шаблоны с заголовком declare(strict_types=1)
	strictTypes: ...     # (bool) по умолчанию false

	# включить [строгий режим разбора |latte:develop#strict mode]
	strictParsing: ...   # (bool) по умолчанию false

	# ограничивает область видимости переменных телом цикла
	scopedLoopVariables: ... # (bool) по умолчанию false

	# убирает отступы, возникающие из-за вложенности в парные теги
	dedent: ...          # (bool) по умолчанию false

	# включить [проверку порождённого кода |latte:develop#Checking Generated Code]
	phpLinter: ...       # (string) по умолчанию null

	# задать локаль
	locale: cs_CZ        # (string) по умолчанию null

	# класс объекта $this->template
	templateClass: App\MyTemplateClass # по умолчанию Nette\Bridges\ApplicationLatte\DefaultTemplate

Новые расширения добавляются так:

latte:
	extensions:
		- Latte\Essential\TranslatorExtension(@Nette\Localization\Translator)

Маршрутизация

Основные настройки:

routing:
	# показывать панель маршрутизации в Tracy Bar?
	debugger: ...   # (bool) включено при наличии Tracy (только в режиме отладки)

	# сериализовать маршрутизатор в DI-контейнер
	cache: ...      # (bool) по умолчанию false

Маршрутизация обычно задаётся в классе RouterFactory. Как вариант, маршруты можно задать и в конфигурации парами маска: действие, но такой способ не даёт большой гибкости:

routing:
	routes:
		'detail/<id>': Admin:Home:default
		'<presenter>/<action>': Front:Home:default

Константы

Создание констант PHP.

constants:
	Foobar: 'baz'

Константа Foobar будет создана после старта приложения.

Константы не должны служить глобально доступными переменными. Для передачи значений объектам используйте внедрение зависимостей.

PHP

Настройка директив PHP. Обзор всех директив есть на php.net.

php:
	date.timezone: Europe/Prague

Сервисы DI

Эти сервисы добавляются в DI-контейнер:

Имя Тип Описание
application.application Nette\Application\Application запускающий модуль приложения
application.linkGenerator Nette\Application\LinkGenerator LinkGenerator
application.presenterFactory Nette\Application\IPresenterFactory фабрика презентеров
application.### Nette\Application\UI\Presenter отдельные презентеры
routing.router Nette\Routing\Router маршрутизатор
latte.latteFactory Nette\Bridges\ApplicationLatte\LatteFactory фабрика объекта Latte\Engine
latte.templateFactory Nette\Application\UI\TemplateFactory фабрика $this->template