TGViewer
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter @phpproglib · 10.5K subscribers
Post #6551 1.81K
🔍 Laravel Request Lifecycle: что происходит до того, как сработает твой контроллер

Контроллер — это не начало запроса, а середина. К моменту, когда выполняется его тело, фреймворк уже прошёл половину пути. Этот путь объясняет, почему register() ≠ boot(), почему route binding — не магия контроллера, и почему синглтоны убивают вас в Octane.

1️⃣ Точка входа

Веб-сервер ничего не знает про роуты и Eloquent. Его задача — отдать запрос в public/index.php. Дальше:
— грузится автолоадер Composer;
— из bootstrap/app.php достаётся инстанс приложения (он же — service container);
— Request::capture() оборачивает $_GET/$_POST/$_SERVER в Illuminate\Http\Request (наследник Symfony Request);
— $app->handleRequest(...) резолвит HTTP Kernel, гоняет запрос, шлёт ответ и терминирует.

2️⃣ HTTP Kernel — координатор, а не бизнес-логика

Включает method override (_method для PUT/PATCH/DELETE), отправляет запрос в роутер, ловит исключения и превращает их в HTTP-ответ через хендлер, диспатчит RequestHandled.

3️⃣ Бутстрап (по порядку)

env → config → exceptions → facades → register providers → boot providers.

Порядок критичен:
→ register() — только биндинги в контейнер, ничего не резолвить
→ boot() — настройка уже зарегистрированных сервисов (гейты, события, view composers)

Правило: биндишь в register, настраиваешь в boot. Иначе словишь зависимость от ещё не зарегистрированного сервиса.

4️⃣ Middleware

Запрос идёт внутрь, ответ — наружу через тот же стек.
— код до $next($request) → на входе
— код после → на выходе (можно менять готовый ответ)

Сначала глобальный стек (CORS, TrustProxies, trim, maintenance), потом роутер. Кто первым увидел запрос, последним увидит ответ.

5️⃣ Роутинг

Роутер матчит route (метод, домен, URI, констрейнты), привязывает route resolver к запросу (поэтому потом работает $request->route()), диспатчит Routing и RouteMatched.

6️⃣ Route middleware + биндинг

Отдельный pipeline под middleware роута (web, api, auth...). Здесь же SubstituteBindings подменяет {post:slug} на модель Post до вызова контроллера. Route model binding живёт в pipeline, а не внутри экшена.

7️⃣ Экшен

Контроллер резолвится из контейнера через make(), а не new — отсюда DI в конструкторе. FormRequest резолвится, авторизуется и валидируется до входа в метод. К началу тела экшена за тебя уже сделана куча работы.

8️⃣ Ответ

Что бы ты ни вернул — строку, массив, модель, Responsable, view — Laravel нормализует в Symfony Response (массив → JSON и т.д.). Дальше ответ идёт назад: route → global middleware. Контроллер вернул одно, а браузер получил другое? Смотри middleware после $next.

9️⃣ send() и terminate()

$response->send() и клиент получил ответ. Но lifecycle не закончен: terminate() запускает terminable middleware и termination callbacks *после* отправки. Удобно для метрик и лёгкого клинапа.

Нюанс: на terminate() middleware резолвится из контейнера заново. Нужен тот же инстанс, что в handle(), так что регай синглтоном. А тяжёлую работу в очередь, не в post-response.

🔟 Octane / queue workers

Классический PHP — свежий процесс на каждый запрос. Длинноживущие воркеры держат приложение в памяти между запросами. Синглтон с request-данными → утечка состояния в соседний запрос. Для request/job-scoped сервисов — scoped(): резолвится раз за lifecycle и сбрасывается на новом.

Библиотека пхпшника
  • 👍 9
  • ❤ 4
  • 🔥 3
More from @phpproglib
  1. Sep 21, 2026⚡️ PHP 8.6 выйдет 19 ноября 2026 года. Сейчас версия находится в beta. Самые заметные изме…
  2. Sep 20, 2026❓ Какие существуют проблемы в многопоточной среде? Основные проблемы многопоточности: 1️⃣…
  3. Sep 19, 2026🌞 В Symfony 8.2 появилось 29 новых Bundle — теперь компоненты вроде Mailer, Messenger и C…
  4. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  5. Sep 18, 2026🐸 Библиотека пхпшника
  6. Sep 17, 2026🛠 `str_contains` и семья: проверяем строки без ловушек Проверка через strpos годами путал…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →