Життєвий цикл запиту
Вступ
Користуючись будь-яким інструментом у реальному житті, ви почуваєтеся впевненіше, якщо розумієте, як він працює. Розробка застосунків нічим не відрізняється. Коли ви розумієте, як працюють ваші інструменти розробки, ви користуєтеся ними спокійніше й упевненіше.
Мета цього документа - дати вам добрий загальний огляд того, як працює фреймворк Laravel. Що краще ви знатимете фреймворк загалом, то менше «магії» в ньому лишатиметься і то впевненіше ви створюватимете свої застосунки. Якщо ви не зрозумієте всіх термінів одразу, не занепадайте духом! Просто спробуйте вловити базову картину того, що відбувається, а ваші знання зростатимуть у міру вивчення інших розділів документації.
Огляд життєвого циклу
Перші кроки
Точка входу для всіх запитів до застосунку Laravel - файл public/index.php. Усі запити спрямовуються до нього конфігурацією вашого веб-сервера (Apache / Nginx). Файл index.php містить небагато коду: він радше є відправною точкою для завантаження решти фреймворку.
Файл index.php завантажує визначення автозавантажувача, згенероване Composer, а потім отримує екземпляр застосунку Laravel із bootstrap/app.php. Перша дія самого Laravel - створення екземпляра застосунку, тобто сервіс-контейнера.
Ядра HTTP і консолі
Далі вхідний запит надсилається або до ядра HTTP, або до ядра консолі - методами handleRequest чи handleCommand екземпляра застосунку, залежно від типу запиту, що надходить. Ці два ядра є центральним місцем, через яке проходять усі запити. Наразі зосередимося на ядрі HTTP, яке є екземпляром Illuminate\Foundation\Http\Kernel.
Ядро HTTP визначає масив bootstrappers, які виконуються перед обробкою запиту. Ці завантажувачі налаштовують обробку помилок, логування, визначають середовище застосунку та виконують інші завдання, які потрібно зробити до фактичної обробки запиту. Зазвичай ці класи опікуються внутрішньою конфігурацією Laravel, про яку вам не потрібно турбуватися.
Ядро HTTP також відповідає за проведення запиту через стек middleware вашого застосунку. Ці middleware читають і записують сесію HTTP, визначають, чи перебуває застосунок у режимі обслуговування, перевіряють токен CSRF тощо. Про них ми поговоримо докладніше згодом.
Сигнатура методу handle ядра HTTP доволі проста: він отримує Request і повертає Response. Уявляйте ядро як велику чорну скриньку, що представляє весь ваш застосунок. Подаєте йому HTTP-запити - і він повертає HTTP-відповіді.
Сервіс-провайдери
Одна з найважливіших дій завантаження ядра - завантаження сервіс-провайдерів вашого застосунку. Сервіс-провайдери відповідають за завантаження всіх різноманітних компонентів фреймворку: бази даних, черг, валідації, маршрутизації тощо.
Laravel пройде цим списком провайдерів і створить екземпляр кожного з них. Після створення екземплярів на всіх провайдерах буде викликано метод register. Далі, коли всі провайдери зареєстровано, на кожному буде викликано метод boot. Так зроблено для того, щоб сервіс-провайдери могли покладатися на те, що на момент виконання їхнього методу boot усі прив'язки контейнера вже зареєстровані й доступні.
Фактично кожну важливу можливість Laravel завантажує й налаштовує якийсь сервіс-провайдер. Оскільки вони завантажують і налаштовують стільки можливостей фреймворку, сервіс-провайдери - найважливіший аспект усього процесу завантаження Laravel.
Хоча внутрішньо фреймворк використовує десятки сервіс-провайдерів, ви також можете створювати власні. Список визначених вами чи сторонніх сервіс-провайдерів, які використовує ваш застосунок, можна знайти у файлі bootstrap/providers.php.
Маршрутизація
Щойно застосунок завантажено й усі сервіс-провайдери зареєстровано, Request передається маршрутизатору для диспетчеризації. Маршрутизатор направить запит до маршруту чи контролера, а також виконає всі middleware, специфічні для цього маршруту.
Middleware дають зручний механізм для фільтрації чи перевірки HTTP-запитів, що надходять до вашого застосунку. Наприклад, Laravel містить middleware, який перевіряє, чи автентифікований користувач вашого застосунку. Якщо ні - middleware перенаправить користувача на екран входу. Якщо ж користувач автентифікований, middleware дозволить запиту рухатися далі вглиб застосунку. Деякі middleware призначені всім маршрутам застосунку - як-от PreventRequestsDuringMaintenance, - а деякі лише конкретним маршрутам чи групам маршрутів. Дізнатися більше можна в повній документації з middleware.
Якщо запит проходить крізь усі middleware, призначені відповідному маршруту, буде виконано метод маршруту чи контролера, і повернута ним відповідь піде назад крізь ланцюжок middleware цього маршруту.
Завершення
Щойно метод маршруту чи контролера повертає відповідь, вона рухається назад назовні крізь middleware маршруту, даючи застосунку змогу змінити чи перевірити вихідну відповідь.
Нарешті, коли відповідь пройшла назад крізь middleware, метод handle ядра HTTP повертає об'єкт відповіді до handleRequest екземпляра застосунку, а той викликає на поверненій відповіді метод send. Метод send надсилає вміст відповіді до браузера користувача. На цьому нашу подорож повним життєвим циклом запиту Laravel завершено!
Зосередимося на сервіс-провайдерах
Сервіс-провайдери - справді ключ до завантаження застосунку Laravel. Створюється екземпляр застосунку, реєструються сервіс-провайдери, і запит передається завантаженому застосунку. Ось так просто!
Добре розуміти, як застосунок Laravel будується й завантажується через сервіс-провайдери, дуже корисно. Визначені вами сервіс-провайдери зберігаються в каталозі app/Providers вашого застосунку.
За замовчуванням AppServiceProvider доволі порожній. Це чудове місце, щоб додати власне завантаження та прив'язки сервіс-контейнера вашого застосунку. Для великих застосунків ви можете створити кілька сервіс-провайдерів, кожен із детальнішим завантаженням конкретних сервісів, які використовує ваш застосунок.