Bootstrap
Bootstrap — это загрузочный код, который инициализирует среду, создает контейнер внедрения зависимостей (DI) и запускает приложение. Мы обсудим:
- как настроить приложение с помощью файлов NEON
- как работать с режимами производства и разработки
- как создать контейнер DI
Приложения, будь то веб-приложения или скрипты командной строки,
начинаются с инициализации среды в той или иной форме. В древние
времена за это мог отвечать файл с именем, например, include.inc.php
,
который включался в исходный файл. В современных приложениях Nette он
заменен классом Bootstrap
, который как часть приложения находится в
файле app/Bootstrap.php
. Это может выглядеть, например, так:
index.php
В случае с веб-приложениями основным файлом является index.php
,
который находится в публичной
директории www/
. В нем класс Bootstrap инициализирует окружение и
создает DI-контейнер. Затем он получает из него службу Application
,
которая запускает веб-приложение:
Как вы видите, класс Nette\Bootstrap\Configurator, который мы сейчас представим более подробно, помогает в настройке окружения и создании контейнера внедрения зависимостей (DI).
Режим разработки и режим производства
Nette ведет себя по-разному в зависимости от того, работает ли он на сервере разработки или на рабочем сервере:
- 🛠️ Режим разработки
- Отображает панель отладки Tracy с полезной информацией (например, SQL-запросы, время выполнения, использование памяти).
- При возникновении ошибки показывает подробную страницу ошибки с трассировкой вызовов функций и содержимым переменных.
- Автоматически обновляет кэш при изменении шаблонов Latte, файлов конфигурации и т. д.
- 🚀 Производственный режим
- Не отображает никакой отладочной информации; все ошибки записываются в журнал.
- При возникновении ошибки показывает
ErrorPresenter
или общую страницу „Ошибка сервера“. - Кэш никогда не обновляется автоматически!
- Оптимизирован для скорости и безопасности.
Режим определяется автоматически, поэтому в большинстве случаев нет необходимости настраивать или переключать его вручную:
- Режим разработки: Активен на localhost (IP-адрес
127.0.0.1
или::1
), если не используется прокси (т.е. на основании HTTP-заголовков). - Производственный режим: Активен везде.
Если вы хотите включить режим разработки в других случаях, например,
для программистов, получающих доступ с определенного IP-адреса, вы
можете использовать setDebugMode()
:
Мы определенно рекомендуем сочетать IP-адрес с файлом cookie. Мы будем
хранить секретный токен в cookie nette-debug', например, `secret1234
, и режим
разработки будет активирован для программистов с такой комбинацией IP
и cookie.
Можно полностью отключить режим разработчика, даже для localhost:
Обратите внимание, что значение true
жестко включает режим
разработчика, чего никогда не должно происходить на рабочем сервере.
Отладочный инструмент Tracy
Для облегчения отладки мы включим замечательный инструмент Tracy. В режиме разработчика он визуализирует ошибки, а в режиме производства — записывает ошибки в указанный каталог:
Временные файлы
Nette использует кэш для DI-контейнера, RobotLoader, шаблонов и т. д. Поэтому необходимо задать путь к директории, где будет храниться кэш:
В Linux или macOS установите права на запись для
каталогов log/
и temp/
.
RobotLoader
Обычно мы хотим автоматически загружать классы с помощью RobotLoader, поэтому мы должны запустить его и позволить ему
загрузить классы из каталога, в котором находится Bootstrap.php
(т. е.
__DIR__
) и все его подкаталоги:
Альтернативный способ — использовать только автозагрузку PSR-4 Composer.
Часовой пояс
Configurator позволяет указать часовой пояс для вашего приложения.
Конфигурация DI-контейнера
Частью процесса загрузки является создание DI-контейнера, то есть фабрики объектов, которая является сердцем всего приложения. На самом деле это PHP-класс, созданный Nette и хранящийся в каталоге кэша. Фабрика создает ключевые объекты приложения, а конфигурационные файлы инструктируют её, как их создавать и настраивать, и таким образом мы влияем на поведение всего приложения.
Файлы конфигурации обычно записываются в формате NEON. Вы можете прочитать что можно настроить здесь.
В режиме разработки контейнер автоматически обновляется каждый раз, когда вы изменяете код или конфигурационные файлы. В производственном режиме он генерируется только один раз, а изменения файлов не проверяются для достижения максимальной производительности.
Файлы конфигурации загружаются с помощью addConfig()
:
Метод addConfig()
может быть вызван несколько раз для добавления
нескольких файлов.
Подключение cli.php
не является опечаткой, конфигурация также
может быть записана в PHP-файле, который возвращает ее в виде массива.
Альтернативно, мы можем использовать секцию includes
для загрузки
конфигурационных файлов.
Если элементы с одинаковыми ключами отображаются в файлах
конфигурации, они будут перезаписаны
или объединены в случае массивов. Позже включенный файл имеет более
высокий приоритет, чем предыдущие. Файл, указанный в секции
includes
, имеет более высокий приоритет, чем файлы, включенные
в него.
Статические параметры
Параметры, используемые в файлах конфигурации, могут быть определены
в секции parameters
и
подхвачены (или перезаписаны) методом addStaticParameters()
(у него есть
алиас addParameters()
). Важно, что разные значения параметров вызывают
генерацию дополнительных DI-контейнеров, то есть дополнительных
классов.
В конфигурационных файлах мы можем написать обычную нотацию
%projectId%
для доступа к параметру с именем projectId
.
Динамические параметры
Можно также добавить динамические параметры в контейнер. Их разные значения, в отличие от статических параметров, не приведут к генерации новых DI-контейнеров.
Переменные среды могут быть легко доступны с использованием
динамических параметров. Мы можем получить доступ к ним через
%env.variable%
в файлах конфигурации.
Параметры по умолчанию
Вы можете использовать следующие статические параметры в конфигурационных файлах:
%appDir%
– абсолютный путь к директории, содержащей файлBootstrap.php
.%wwwDir%
– абсолютный путь к директории, содержащей входной файлindex.php
%tempDir%
– абсолютный путь к директории для временных файлов.%vendorDir%
– абсолютный путь к директории, в которую Composer устанавливает библиотеки.%rootDir%
– абсолютный путь к корневому каталогу проекта.%debugMode%
указывает, находится ли приложение в режиме отладки%consoleMode%
указывает, поступил ли запрос через командную строку
Импортированные сервисы
Углубимся дальше. Хотя цель DI-контейнера в создании объектов, может
возникнуть необходимость вставить существующий объект в контейнер.
Это делается определением сервиса с атрибутом imported: true
:
Создаём новый экземпляр и вставляем его в Bootstrap:
Разные среды
Не стесняйтесь настраивать класс Bootstrap
в соответствии с
вашими потребностями. Вы можете добавить параметры в метод
bootWebApplication()
, чтобы различать веб-проекты. Также можно добавить
другие методы, например bootTestEnvironment()
для инициализации
окружения для модульных тестов, bootConsoleApplication()
для скриптов,
вызываемых из командной строки, и так далее.