13Жизненный цикл запроса
Одиннадцать шагов от index.php до ответа, что происходит на этапе предзагрузки и почему bootstrap должен быть лёгким.
Каждый запрос проходит один и тот же путь: входной скрипт → приложение → маршрут → контроллер → фильтры → действие → модель → представление → ответ. Понимая эту цепочку, легко найти, куда встроить свой код: события, фильтры, bootstrap.
Узлы кликабельны — каждый ведёт к своему разделу.
Одиннадцать шагов#
- Пользователь открывает URL — запрос приходит во входной скрипт
web/index.php. - Скрипт загружает конфигурацию и создаёт объект
yii\web\Application. - Приложение разбирает маршрут с помощью компонента
request(иurlManagerпри ЧПУ):post/view+ параметры. - Создаётся контроллер —
PostController, по соглашению об именах или изcontrollerMap. - Создаётся действие и к нему применяются фильтры (
beforeActionприложения → модуля → контроллера). - Любой фильтр не пропустил — обработка останавливается: редирект на вход, 403, 405…
- Все фильтры пройдены — выполняется действие.
- Действие работает с моделью — обычно это запросы к базе через Active Record.
- Действие рендерит представление, передавая ему данные модели; результат оборачивается в шаблон.
- Результат попадает в компонент
response(afterActionв обратном порядке, событиеafterRequest). responseотправляет заголовки и тело браузеру.
Подробнее о шагах: приложение и входной скрипт, маршрутизация, контроллеры, фильтры, запрос и ответ.
Предзагрузка (bootstrapping)#
Всё, что происходит до обработки запроса, — предзагрузка. Она идёт в двух местах:
Во входном скрипте: регистрируются автозагрузчики (Composer, затем Yii через Yii.php), читается конфигурация, создаётся приложение.
В конструкторе приложения:
preInit()— применяются самые важные свойства (basePath);- регистрируется обработчик ошибок;
- применяется остальная конфигурация;
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… |
На этапе фильтров: если один из beforeAction вернул false (нет доступа, неверный HTTP-метод), действие не выполняется.
Подключает расширения из extensions.php, вызывает их bootstrap-классы, создаёт компоненты и модули из свойства bootstrap и вызывает у них bootstrap($app), если реализован интерфейс.
Чтобы ошибки в самой конфигурации и при создании компонентов уже перехватывались и показывались понятно.
До подключения Yii.php — тогда автозагрузчик Yii встанет первым в очереди и будет проверять классы раньше остальных.