Джерело: https://laravelukraine.com/docs/13.x/lifecycle

# Життєвий цикл запиту

- [Вступ](#introduction)
- [Огляд життєвого циклу](#lifecycle-overview)
    - [Перші кроки](#first-steps)
    - [Ядра HTTP і консолі](#http-console-kernels)
    - [Сервіс-провайдери](#service-providers)
    - [Маршрутизація](#routing)
    - [Завершення](#finishing-up)
- [Зосередимося на сервіс-провайдерах](#focus-on-service-providers)

<a name="introduction"></a>
## Вступ

Користуючись будь-яким інструментом у реальному житті, ви почуваєтеся впевненіше, якщо розумієте, як він працює. Розробка застосунків нічим не відрізняється. Коли ви розумієте, як працюють ваші інструменти розробки, ви користуєтеся ними спокійніше й упевненіше.

Мета цього документа - дати вам добрий загальний огляд того, як працює фреймворк Laravel. Що краще ви знатимете фреймворк загалом, то менше «магії» в ньому лишатиметься і то впевненіше ви створюватимете свої застосунки. Якщо ви не зрозумієте всіх термінів одразу, не занепадайте духом! Просто спробуйте вловити базову картину того, що відбувається, а ваші знання зростатимуть у міру вивчення інших розділів документації.

<a name="lifecycle-overview"></a>
## Огляд життєвого циклу

<a name="first-steps"></a>
### Перші кроки

Точка входу для всіх запитів до застосунку Laravel - файл `public/index.php`. Усі запити спрямовуються до нього конфігурацією вашого веб-сервера (Apache / Nginx). Файл `index.php` містить небагато коду: він радше є відправною точкою для завантаження решти фреймворку.

Файл `index.php` завантажує визначення автозавантажувача, згенероване Composer, а потім отримує екземпляр застосунку Laravel із `bootstrap/app.php`. Перша дія самого Laravel - створення екземпляра застосунку, тобто [сервіс-контейнера](/docs/{{version}}/container).

<a name="http-console-kernels"></a>
### Ядра HTTP і консолі

Далі вхідний запит надсилається або до ядра HTTP, або до ядра консолі - методами `handleRequest` чи `handleCommand` екземпляра застосунку, залежно від типу запиту, що надходить. Ці два ядра є центральним місцем, через яке проходять усі запити. Наразі зосередимося на ядрі HTTP, яке є екземпляром `Illuminate\Foundation\Http\Kernel`.

Ядро HTTP визначає масив `bootstrappers`, які виконуються перед обробкою запиту. Ці завантажувачі налаштовують обробку помилок, логування, [визначають середовище застосунку](/docs/{{version}}/configuration#environment-configuration) та виконують інші завдання, які потрібно зробити до фактичної обробки запиту. Зазвичай ці класи опікуються внутрішньою конфігурацією Laravel, про яку вам не потрібно турбуватися.

Ядро HTTP також відповідає за проведення запиту через стек `middleware` вашого застосунку. Ці `middleware` читають і записують [сесію HTTP](/docs/{{version}}/session), визначають, чи перебуває застосунок у режимі обслуговування, [перевіряють токен CSRF](/docs/{{version}}/csrf) тощо. Про них ми поговоримо докладніше згодом.

Сигнатура методу `handle` ядра HTTP доволі проста: він отримує `Request` і повертає `Response`. Уявляйте ядро як велику чорну скриньку, що представляє весь ваш застосунок. Подаєте йому HTTP-запити - і він повертає HTTP-відповіді.

<a name="service-providers"></a>
### Сервіс-провайдери

Одна з найважливіших дій завантаження ядра - завантаження [сервіс-провайдерів](/docs/{{version}}/providers) вашого застосунку. Сервіс-провайдери відповідають за завантаження всіх різноманітних компонентів фреймворку: бази даних, черг, валідації, маршрутизації тощо.

Laravel пройде цим списком провайдерів і створить екземпляр кожного з них. Після створення екземплярів на всіх провайдерах буде викликано метод `register`. Далі, коли всі провайдери зареєстровано, на кожному буде викликано метод `boot`. Так зроблено для того, щоб сервіс-провайдери могли покладатися на те, що на момент виконання їхнього методу `boot` усі прив'язки контейнера вже зареєстровані й доступні.

Фактично кожну важливу можливість Laravel завантажує й налаштовує якийсь сервіс-провайдер. Оскільки вони завантажують і налаштовують стільки можливостей фреймворку, сервіс-провайдери - найважливіший аспект усього процесу завантаження Laravel.

Хоча внутрішньо фреймворк використовує десятки сервіс-провайдерів, ви також можете створювати власні. Список визначених вами чи сторонніх сервіс-провайдерів, які використовує ваш застосунок, можна знайти у файлі `bootstrap/providers.php`.

<a name="routing"></a>
### Маршрутизація

Щойно застосунок завантажено й усі сервіс-провайдери зареєстровано, `Request` передається маршрутизатору для диспетчеризації. Маршрутизатор направить запит до маршруту чи контролера, а також виконає всі `middleware`, специфічні для цього маршруту.

`Middleware` дають зручний механізм для фільтрації чи перевірки HTTP-запитів, що надходять до вашого застосунку. Наприклад, Laravel містить `middleware`, який перевіряє, чи автентифікований користувач вашого застосунку. Якщо ні - `middleware` перенаправить користувача на екран входу. Якщо ж користувач автентифікований, `middleware` дозволить запиту рухатися далі вглиб застосунку. Деякі `middleware` призначені всім маршрутам застосунку - як-от `PreventRequestsDuringMaintenance`, - а деякі лише конкретним маршрутам чи групам маршрутів. Дізнатися більше можна в повній [документації з `middleware`](/docs/{{version}}/middleware).

Якщо запит проходить крізь усі `middleware`, призначені відповідному маршруту, буде виконано метод маршруту чи контролера, і повернута ним відповідь піде назад крізь ланцюжок `middleware` цього маршруту.

<a name="finishing-up"></a>
### Завершення

Щойно метод маршруту чи контролера повертає відповідь, вона рухається назад назовні крізь `middleware` маршруту, даючи застосунку змогу змінити чи перевірити вихідну відповідь.

Нарешті, коли відповідь пройшла назад крізь `middleware`, метод `handle` ядра HTTP повертає об'єкт відповіді до `handleRequest` екземпляра застосунку, а той викликає на поверненій відповіді метод `send`. Метод `send` надсилає вміст відповіді до браузера користувача. На цьому нашу подорож повним життєвим циклом запиту Laravel завершено!

<a name="focus-on-service-providers"></a>
## Зосередимося на сервіс-провайдерах

Сервіс-провайдери - справді ключ до завантаження застосунку Laravel. Створюється екземпляр застосунку, реєструються сервіс-провайдери, і запит передається завантаженому застосунку. Ось так просто!

Добре розуміти, як застосунок Laravel будується й завантажується через сервіс-провайдери, дуже корисно. Визначені вами сервіс-провайдери зберігаються в каталозі `app/Providers` вашого застосунку.

За замовчуванням `AppServiceProvider` доволі порожній. Це чудове місце, щоб додати власне завантаження та прив'язки сервіс-контейнера вашого застосунку. Для великих застосунків ви можете створити кілька сервіс-провайдерів, кожен із детальнішим завантаженням конкретних сервісів, які використовує ваш застосунок.