Жизненный цикл запроса
11.x
.
Почему это важно?
Введение
При использовании любого инструмента в «реальном мире» вы чувствуете себя увереннее, если понимаете, как работает этот инструмент. Разработка приложений ничем не отличается. Вы чувствуете себя комфортнее и увереннее, когда понимаете, как работают используемые вами инструменты разработки.
Цель этого документа – дать вам хороший общий обзор того, как работает фреймворк Laravel. Если вы лучше узнаете общую структуру, то все станет менее «волшебным», и вы будете более уверены при создании своих приложений. Если вы не сразу поняли все термины, то не унывайте! Просто попытайтесь получить общее представление о том, что происходит, и ваши знания будут расти по мере изучения других разделов документации.
Обзор жизненного цикла
Первые шаги
Точкой входа для всех запросов к приложению Laravel является файл public/index.php
. Все запросы направляются в этот файл конфигурацией вашего веб-сервера (Apache / Nginx). Файл index.php
не содержит большого количества кода. Скорее, это отправная точка для загрузки остальной части фреймворка.
Файл index.php
загружает автозагрузчик, созданный менеджером пакетов Composer, а затем извлекает экземпляр приложения Laravel из bootstrap/app.php
. Первым действием, предпринимаемым самим Laravel, является создание экземпляра приложения / контейнера служб.
HTTP-ядро и ядро консоли
Затем входящий запрос отправляется либо HTTP-ядру, либо ядру консоли, в зависимости от типа запроса, поступающего в приложение. Эти два ядра служат центральным местом, через которое проходят все запросы. А пока давайте сосредоточимся на ядре HTTP, которое находится в app/Http/Kernel.php
.
HTTP-ядро расширяет класс Illuminate\Foundation\Http\Kernel
, который определяет массив загрузчиков (bootstrappers
), запускающихся до выполнения запроса. Эти загрузчики настраивают обработку ошибок, логирование, определяют среду приложения и выполняют другие задачи, которые необходимо выполнить до фактической обработки запроса. Обычно эти классы обращаются ко внутренней конфигурации Laravel, о которой вам не нужно беспокоиться.
Ядро HTTP также определяет список HTTP-посредников, через которые должны пройти все запросы, прежде чем они будут обработаны приложением. Эти посредники обрабатывают чтение и запись HTTP-сессий, определяют, находится ли приложение в режиме обслуживания, проверяют токен CSRF и многое другое. Мы поговорим об этом позже.
Сигнатура метода handle
HTTP-ядра довольно проста: он получает запрос (Request
) и возвращает ответ (Response
). Думайте о ядре как о большом черном ящике, который представляет все ваше приложение. Дайте ему HTTP-запросы, и оно вернет HTTP-ответы.
Сервис-провайдеры
Одно из самых важных действий инициализации ядра – это загрузка сервис-провайдеров для вашего приложения. Сервис-провайдеры отвечают за начальную настройку различных компонентов фреймворка, таких как база данных, очереди, валидация и маршрутизация. Все сервис-провайдеры приложения настраиваются в массиве providers
файла конфигурации config/app.php
.
Laravel пройдет по этому списку сервис-провайдеров и создаст экземпляры каждого из них. После создания экземпляров провайдеров, для каждого будет вызван метод register
. Затем, как только все провайдеры будут зарегистрированы, будет вызван метод boot
каждого из них. Таким образом сервис-провайдеры могут расчитывать на то, что все связывания в контейнере служб будут зарегистрированы и доступны к моменту запуска метода boot
.
Практически каждая основная функция, предлагаемая Laravel, инициализируется и настраивается с помощью сервис-провайдеров. Поскольку они инициализируют и настраивают множество функций, предоставляемых фреймворком, сервис-провайдеры являются самой важной частью всего процесса загрузки Laravel.
Маршрутизация
Одним из наиболее важных сервис-провайдеров в вашем приложении является App\Providers\RouteServiceProvider
. Этот провайдер загружает файлы маршрутов, содержащиеся в каталоге routes
приложения. Откройте код RouteServiceProvider
и посмотрите, как он работает!
После того как приложение было загружено и все поставщики служб зарегистрированы, Request
будет передан маршрутизатору для исполнения. Маршрутизатор отправит запрос на маршрут или контроллер, а также запустит посредник для конкретного маршрута.
Посредники обеспечивают удобный механизм фильтрации или исследования HTTP-запросов, поступающих в ваше приложение. Например, Laravel содержит посредника, который проверяет аутентификацию пользователя вашего приложения. Если пользователь не аутентифицирован, посредник перенаправит пользователя, например, на экран входа в систему. Однако, если пользователь аутентифицирован, посредник позволит запросу продолжить работу в приложении. Некоторые посредники назначаются всем маршрутам в приложении, например, определенные в свойстве $middleware
вашего ядра HTTP, тогда как некоторые назначаются только для определенных маршрутов или групп маршрутов. Вы можете узнать больше о посредниках, прочитав полную документацию по посредникам.
Если запрос успешно проходит через всех посредников, назначенных определенному маршруту, то метод маршрута или контроллера будет выполнен, а ответ, возвращенный методом маршрута или контроллера, будет отправлен обратно через цепочку посредников маршрута.
Окончание
Когда метод маршрута или контроллера вернет ответ, тогда ответ отправится обратно через посредников маршрута, обеспечивая приложению возможность изменения или проверки исходящего ответа.
Наконец, как только ответ проходит через посредников, метод handle
ядра HTTP возвращает объект ответа, а файл index.php
вызывает метод send
для возвращенного ответа. Метод send
отправляет содержимое ответа в веб-браузер пользователя. Мы завершили наш путь через весь жизненный цикл запроса Laravel!
Сосредоточьтесь на сервис-провайдерах
Сервис-провайдеры действительно являются ключом к начальной загрузке приложения Laravel. Экземпляр приложения создается, сервис-провайдеры регистрируются, и запрос передается загруженному приложению. Это действительно так просто!
Очень важно иметь четкое представление о том, как создается и загружается приложение Laravel через сервис-провайдеры. Сервис-провайдеры для вашего приложения хранятся в каталоге app/Providers
.
По умолчанию провайдер AppServiceProvider
относительно пуст. Этот провайдер является отличным местом для добавления собственной инициализации и связываний контейнера служб вашего приложения. Для больших приложений вы можете создать несколько поставщиков, каждый из которых детализирует начальную загрузку для конкретных сервисов, используемых вашим приложением.