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

Вступ

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

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

Огляд життєвого циклу

Перші кроки

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

Файл index.php завантажує згенероване Composer визначення автозавантажувача, а потім отримує екземпляр Laravel застосунку з bootstrap/app.php. Першою дією, яку виконує сам Laravel, є створення екземпляра застосунку / сервіс-контейнера.

HTTP / Console Ядра

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

HTTP-ядро визначає масив bootstrappers, які будуть виконані перед обробкою запиту. Ці bootstrappers налаштовують обробку помилок, налаштовують логування, визначають середовище застосунку та виконують інші завдання, які потрібно виконати перед фактичною обробкою запиту. Зазвичай ці класи обробляють внутрішню конфігурацію Laravel, про яку вам не потрібно турбуватися.

HTTP-ядро також відповідає за передачу запиту через стек проміжного програмного забезпечення застосунку. Ці проміжні програмні засоби обробляють читання та запис HTTP-сесії, визначають, чи перебуває застосунок у режимі обслуговування, перевіряють CSRF-токен та інше. Ми поговоримо про це детальніше незабаром.

The метод підпису для методу HTTP ядра handle є досить простим: він отримує 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.

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

Завершення

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

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

Зосередтесь на Сервіс-провайдерах

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

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

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