Жизненный цикл запроса в деталях
- 1. Стандартный жизненный цикл
- 2. Копнем глубже
- 2.1. Загрузка (Loading)
- 2.2. Инициализация (Booting)
- 2.3. Выполнение (Running)
Стандартный жизненный цикл
Стандартный жизненный цикл состоит из следующих пунктов:
- HTTP-запрос через Роуты (Routes) поступает в Контроллер (Controller)
- Контроллер осуществляет некоторые действия в зависимости от запроса и передает данные в Отображения (Views)
- Отображения отображают полученные данные заданным образом, обеспечивая HTTP-ответ.
Есть много отклонений и различных вариантов вышеприведенной схемы, но она дает нам три опорные точки, на которые надо обратить внимание:
- Роуты — app/routes.php
- Контроллеры — app/controllers/
- Отображения — app/views/
«Отклонения» могут быть, например, такими:
- Роуты могут возвращать Отображения или сам Ответ (объект Response), без задействования Контроллеров.
- До или после Роутов могут срабатывать Фильтры (app/filters.php)
- В процесс могут вмешаться Исключения (Exceptions) или ошибки приложения.
- Отклики на события.
Копнем глубже
Более глубокое понимание жизненного цикла запроса в Laravel позволит вам понять, где именно можно (и стоит) писать ваш код.
Цикл запроса можно разбить на три части: Загрузка (Loading), Инициализация (Booting) и Выполнение (Running).
Загрузка (Loading)
Вот три основные области, где ваше приложение может повлиять на процесс загрузки фреймворка:
- Пакеты Workbench. Workbench — это способ организовывать свой код в обособленные пакеты и тестировать их внутри вашего приложения перед тем как сделать их пакетами, распространяемыми через Composer. См. документацию.
- Среда выполнения. В зависимости от установки среды, будут загружены те или иные конфиги, те или иные старт-файлы.
- Пути. Редактируя bootstrap/paths.php вы можете изменить файловую структуру фреймворка, расположив файлы в удобных для вас местах.
Инициализация (Booting)
Есть 10 областей, где вы можете влиять на процесс инициализации фреймворка.
Файлы настроек
Файлы настроек влияют и на процесс инициализации и на процесс работы фреймворка.
Сервис-провайдеры (Service Providers)
Любые сервис-провайдеры, которые вы создали или подсоединили к своему приложению в конфиге config/app.php загружаются в начале процесса инициализации. Если сервис-провайдер не отложенный, вызывается его метод register().
Загрузка и применение старт-файлов
Регистрируются старт-файлы, которые надо загрузить, когда будет вызвано событие booted.
Стэк middleware разворачивается вниз
Middleware вложены один в другой как матрешки. Верхний middeware обрабатывает запрос и вызывает middleware следующего уровня, и так далее. Последний middleware вызывает приложение. Все middlewares заносятся в стек, и будут вызваны снова в конце части Выполнения (Running).
Инициализация сервис-провайдеров
Вызывается метод boot() у всех зарегистрированных не-отложенных сервис-провайдеров.
Функции обратного вызова пре-инициализации
Вызываются все функции-замыкания, зарегистрированные в App::booting()
Функции обратного вызова пост-инициализации
Вызываются все функции-замыкания, зарегистрированные в App::booted(). Загружаются старт-файлы, зарегистрированные на шаге 3.
Глобальные старт-файлы
Первым делом это app/start/global.php, затем, если исполняется artisan-команда, то app/start/artisan.php.
Старт-файл среды выполнения
Исполняется файл, который имеет то же имя файла, что и название среды выполнения — app/start/{environment}.php
Маршруты
Исполняется app/routes.php. Этот файл вы будете редактировать наиболее часто в процессе разработки вашего приложения.
Выполнение (Running)
10 областей, где вы можете влиять на процесс выполнения:
Режим обслуживания
Если вы зарегистрировали функцию-подписчик режима обслуживания и приложение находится в этом режиме, эта функция выполняется.
Фильтр before уровня приложения
Если у вас есть фильтры, зарегистрированные в App::before(), они выполняются.
Фильтры before в маршрутах
Если у вас есть фильтры before в маршрутах, они выполняются.
Исполнение запроса
После разбора, к какому маршруту относится запрос, вызывается действие (метод) нужного контроллера или замыкание маршрута.
Фильтры after в маршрутах
Если у вас есть фильтры after в маршрутах, они выполняются.
Фильтр after уровня приложения
Если у вас есть фильтры, зарегистрированные в App::after(), они выполняются.
Стек middleware разворачивается вверх
Это точка, где объект Response передается вверх по стеку middlewares. Каждый middleware может изменять этот объект.
Middleware shutdown
Если у вас есть middleware, которые реализуют TerminableInterface, вызывается метод shutdown() этих middleware.
Функции обратного вызова finish
Если у вас есть функции, зарегистрированные в App::finish(), они выполняются.
Функции обратного вызова shutdown
Если у вас есть функции, зарегистрированные в App::shutdown(), они выполняются.