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

Обзор параметров конфигурации 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
версия: 4.x