Стандартный жизненный цикл
Стандартный жизненный цикл состоит из следующих пунктов:
- 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 загружаются в начале процесса инициализации. Если сервис-провайдер не отложенный, вызывается его метод
PHPregister()
. - Загрузка и применение старт-файлов
- Регистрируются старт-файлы, которые надо загрузить, когда будет вызвано событие booted.
- Стэк middleware разворачивается вниз
- Middleware вложены один в другой как матрешки. Верхний middeware обрабатывает запрос и вызывает middleware следующего уровня, и так далее. Последний middleware вызывает приложение. Все middlewares заносятся в стек, и будут вызваны снова в конце части Выполнения (Running).
- Инициализация сервис-провайдеров
- Вызывается метод
PHPboot()
у всех зарегистрированных не-отложенных сервис-провайдеров. - Функции обратного вызова пре-инициализации
- Вызываются все функции-замыкания, зарегистрированные в
PHPApp::booting()
- Функции обратного вызова пост-инициализации
- Вызываются все функции-замыкания, зарегистрированные в
PHPApp::booted()
. Загружаются старт-файлы, зарегистрированные на шаге 3. - Глобальные старт-файлы
- Первым делом это app/start/global.php, затем, если исполняется artisan-команда, то app/start/artisan.php.
- Старт-файл среды выполнения
- Исполняется файл, который имеет то же имя файла, что и название среды выполнения — app/start/{environment}.php
- Маршруты
- Исполняется app/routes.php. Этот файл вы будете редактировать наиболее часто в процессе разработки вашего приложения.
Выполнение (Running)
10 областей, где вы можете влиять на процесс выполнения:
- Режим обслуживания
- Если вы зарегистрировали функцию-подписчик режима обслуживания и приложение находится в этом режиме, эта функция выполняется.
- Фильтр before уровня приложения
- Если у вас есть фильтры, зарегистрированные в
PHPApp::before()
, они выполняются. - Фильтры before в маршрутах
- Если у вас есть фильтры before в маршрутах, они выполняются.
- Исполнение запроса
- После разбора, к какому маршруту относится запрос, вызывается действие (метод) нужного контроллера или замыкание маршрута.
- Фильтры after в маршрутах
- Если у вас есть фильтры after в маршрутах, они выполняются.
- Фильтр after уровня приложения
- Если у вас есть фильтры, зарегистрированные в
PHPApp::after()
, они выполняются. - Стек middleware разворачивается вверх
- Это точка, где объект Response передается вверх по стеку middlewares. Каждый middleware может изменять этот объект.
- Middleware shutdown
- Если у вас есть middleware, которые реализуют
PHPTerminableInterface
, вызывается методPHPshutdown()
этих middleware. - Функции обратного вызова finish
- Если у вас есть функции, зарегистрированные в
PHPApp::finish()
, они выполняются. - Функции обратного вызова shutdown
- Если у вас есть функции, зарегистрированные в
PHPApp::shutdown()
, они выполняются.
Комментарии (1)
Спасибо, теперь стало вообще не понятно)