Жизненный цикл запроса
Введение
При использовании любого инструмента в «реальном мире» вы чувствуете себя увереннее, если понимаете, как работает этот инструмент. Разработка приложений ничем не отличается. Вы чувствуете себя комфортнее и увереннее, когда понимаете, как работают используемые вами инструменты разработки.
Цель этого документа – дать вам хороший общий обзор того, как работает фреймворк 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 также отвечает за передачу запроса через стек посредников. Эти посредники обрабатывают чтение и запись сеанса HTTP, определяет, находится ли приложение в режиме обслуживания, проверяет токен CSRF и многое другое. Мы поговорим об этом подробнее в ближайшее время.
Сигнатура метода handle
HTTP-ядра довольно проста: он получает запрос (Request
) и возвращает ответ (Response
). Думайте о ядре как о большом черном ящике, который представляет все ваше приложение. Дайте ему HTTP-запросы, и оно вернет HTTP-ответы.
Сервис-провайдеры
Одно из самых важных действий инициализации ядра – это загрузка сервис-провайдеров для вашего приложения. Сервис-провайдеры отвечают за начальную настройку различных компонентов фреймворка, таких как база данных, очереди, валидация и маршрутизация.
Laravel пройдет по этому списку сервис-провайдеров и создаст экземпляры каждого из них. После создания экземпляров провайдеров, для каждого будет вызван метод register
. Затем, как только все провайдеры будут зарегистрированы, будет вызван метод boot
каждого из них. Таким образом сервис-провайдеры могут расчитывать на то, что все связывания в контейнере служб будут зарегистрированы и доступны к моменту запуска метода boot
.
Практически каждая основная функция, предлагаемая Laravel, инициализируется и настраивается с помощью сервис-провайдеров. Поскольку они инициализируют и настраивают множество функций, предоставляемых фреймворком, сервис-провайдеры являются самой важной частью всего процесса загрузки Laravel.
Хотя внутри фреймворка используются десятки сервис-провайдеров, у вас также есть возможность создать своих собственных. Вы можете найти список пользовательских или сторонних сервис-провайдеров, которые использует ваше приложение, в файле bootstrap/providers.php
.
Маршрутизация
После того как приложение было загружено и все поставщики служб зарегистрированы, Request
будет передан маршрутизатору для исполнения. Маршрутизатор отправит запрос на маршрут или контроллер, а также запустит посредник для конкретного маршрута.
Посредники обеспечивают удобный механизм фильтрации или исследования HTTP-запросов, поступающих в ваше приложение. Например, Laravel содержит посредника, который проверяет аутентификацию пользователя вашего приложения. Если пользователь не аутентифицирован, посредник перенаправит пользователя, например, на экран входа в систему. Однако, если пользователь аутентифицирован, посредник позволит запросу продолжить работу в приложении. Некоторые посредники назначаются всем маршрутам в приложении, например PreventRequestsDuringMaintenance
, тогда как некоторые назначаются только для определенных маршрутов или групп маршрутов. Вы можете узнать больше о посредниках, прочитав полную документацию по посредникам.
Если запрос успешно проходит через всех посредников, назначенных определенному маршруту, то метод маршрута или контроллера будет выполнен, а ответ, возвращенный методом маршрута или контроллера, будет отправлен обратно через цепочку посредников маршрута.
Окончание
Когда метод маршрута или контроллера вернет ответ, тогда ответ отправится обратно через посредников маршрута, обеспечивая приложению возможность изменения или проверки исходящего ответа.
Наконец, как только ответ проходит через посредников, метод handle
ядра HTTP возвращает объект ответа в handleRequest
экземпляра приложения, и этот метод вызывает метод send
для возвращенного ответа. Метод send
отправляет содержимое ответа в веб-браузер пользователя. Мы завершили весь жизненный цикл запроса Laravel!
Сосредоточьтесь на сервис-провайдерах
Сервис-провайдеры действительно являются ключом к начальной загрузке приложения Laravel. Экземпляр приложения создается, сервис-провайдеры регистрируются, и запрос передается загруженному приложению. Это действительно так просто!
Очень важно иметь четкое представление о том, как создается и загружается приложение Laravel через сервис-провайдеры. Пользовательские сервис-провайдеры для вашего приложения хранятся в каталоге app/Providers
.
По умолчанию провайдер AppServiceProvider
относительно пуст. Этот провайдер является отличным местом для добавления собственной инициализации и связываний контейнера служб вашего приложения. Для больших приложений вы можете создать несколько поставщиков, каждый из которых детализирует начальную загрузку для конкретных сервисов, используемых вашим приложением.