2 · курс
0%
Главная/🔁Обработка запроса

13Жизненный цикл запроса

Одиннадцать шагов от index.php до ответа, что происходит на этапе предзагрузки и почему bootstrap должен быть лёгким.

⏱ ~3 мин 📚 2 главы руководства

Каждый запрос проходит один и тот же путь: входной скрипт → приложение → маршрут → контроллер → фильтры → действие → модель → представление → ответ. Понимая эту цепочку, легко найти, куда встроить свой код: события, фильтры, bootstrap.

Жизненный цикл запроса в Yii 2: браузер → входной скрипт → приложение → маршрут → контроллер → фильтры → действие → модель → представление → ответ → браузер Браузер HTTP-запрос index.php входной скрипт Application конфиг + bootstrap Маршрут urlManager → post/view Контроллер PostController Фильтры beforeAction() Действие actionView($id) Модель · БД Post::findOne($id) Представление render() + layout Ответ Response::send() 1. пользователь открывает URL фильтр вернул false → стоп afterAction() → EVENT_AFTER_REQUEST → браузеру

Узлы кликабельны — каждый ведёт к своему разделу.

Одиннадцать шагов#

  1. Пользователь открывает URL — запрос приходит во входной скрипт web/index.php.
  2. Скрипт загружает конфигурацию и создаёт объект yii\web\Application.
  3. Приложение разбирает маршрут с помощью компонента request (и urlManager при ЧПУ): post/view + параметры.
  4. Создаётся контроллер — PostController, по соглашению об именах или из controllerMap.
  5. Создаётся действие и к нему применяются фильтры (beforeAction приложения → модуля → контроллера).
  6. Любой фильтр не пропустил — обработка останавливается: редирект на вход, 403, 405…
  7. Все фильтры пройдены — выполняется действие.
  8. Действие работает с моделью — обычно это запросы к базе через Active Record.
  9. Действие рендерит представление, передавая ему данные модели; результат оборачивается в шаблон.
  10. Результат попадает в компонент response (afterAction в обратном порядке, событие afterRequest).
  11. response отправляет заголовки и тело браузеру.

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

Предзагрузка (bootstrapping)#

Всё, что происходит до обработки запроса, — предзагрузка. Она идёт в двух местах:

Во входном скрипте: регистрируются автозагрузчики (Composer, затем Yii через Yii.php), читается конфигурация, создаётся приложение.

В конструкторе приложения:

  1. preInit() — применяются самые важные свойства (basePath);
  2. регистрируется обработчик ошибок;
  3. применяется остальная конфигурация;
  4. init() → bootstrap():

    • подключается манифест vendor/yiisoft/extensions.php, создаются и запускаются bootstrap-классы расширений;
    • создаются компоненты и модули из свойства bootstrap приложения; у тех, кто реализует BootstrapInterface, вызывается bootstrap($app).

Что ещё ускоряет старт:

  • OPcache/APCu в проде — кеш байткода избавляет от разбора PHP-файлов при каждом запросе.
  • Кеширование конфигурации: если она собрана из десятка файлов, соберите один раз и читайте готовый массив из кеша до создания приложения.
  • Подробнее — в разделе Производительность.

Куда встроиться#

Момент Инструмент
до любого запроса (регистрация правил, зависимостей DI)BootstrapInterface + свойство bootstrap
до/после обработки запросасобытия beforeRequest/afterRequest приложения
до/после действияфильтры или события beforeAction/afterAction
перед отправкой ответасобытия beforeSend/afterPrepare/afterSend компонента response
при рендерингесобытия View: beforeRender, endBody…
Проверь себя4

На этапе фильтров: если один из beforeAction вернул false (нет доступа, неверный HTTP-метод), действие не выполняется.

Подключает расширения из extensions.php, вызывает их bootstrap-классы, создаёт компоненты и модули из свойства bootstrap и вызывает у них bootstrap($app), если реализован интерфейс.

Чтобы ошибки в самой конфигурации и при создании компонентов уже перехватывались и показывались понятно.

До подключения Yii.php — тогда автозагрузчик Yii встанет первым в очереди и будет проверять классы раньше остальных.