Версия фреймворка: 8.x 5.4 4.2
Это скорректированный автоматический перевод, сделанный при помощи google translate.

Жизненный цикл запроса

Введение

При использовании любого инструмента в «реальном мире» вы чувствуете себя более уверенно, если понимаете, как работает этот инструмент. Разработка приложений ничем не отличается. Вы чувствуете себя более комфортно и уверенно, когда понимаете, как работают используемые вами инструменты разработки.

Цель этого документа – дать вам хороший общий обзор того, как работает фреймворк 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 каждого из них.

Поставщики служб несут ответственность за загрузку всевозможных компонентов инфраструктуры, таких как компоненты БД, очереди, валидации и маршрутизации. По сути, каждая основная функция Laravel загружается и настраивается поставщиком служб. Поскольку они запускают и настраивают так много функций, предлагаемых фреймворком, поставщики служб являются наиболее важным аспектом всего процесса начальной загрузки Laravel.

Вам может быть интересно, почему метод register каждого поставщика служб вызывается перед вызовом метода boot для любого поставщика служб. Ответ прост. Вызывая сначала метод register каждого из поставщиков служб, обеспечивается возможность зависимости остальных поставщиков от любых «связываний контейнера», которые будут уже зарегистрированы и доступны к моменту выполнения метода boot.

Маршрутизация

Одним из наиболее важных поставщиков служб в вашем приложении является App\Providers\RouteServiceProvider. Этот поставщик загружает файлы маршрутов, содержащиеся в каталоге routes приложения. Откройте код RouteServiceProvider и посмотрите, как он работает!

После того, как приложение было загружено и все поставщики служб зарегистрированы, Request будет передан маршрутизатору для исполнения. Маршрутизатор отправит запрос на маршрут или контроллер, а также запустит посредник для конкретного маршрута.

Посредники обеспечивают удобный механизм фильтрации или интерпретации HTTP-запросов, поступающих в ваше приложение. Например, Laravel содержит посредника, который проверяет аутентификацию пользователя вашего приложения. Если пользователь не аутентифицирован, посредник перенаправит пользователя, например, на экран входа в систему. Однако, если пользователь аутентифицирован, посредник позволит запросу продолжить работу в приложении. Некоторые посредники назначаются всем маршрутам в приложении, например, определенным в свойстве $middleware вашего ядра HTTP, тогда как некоторые назначаются только для определенных маршрутов или групп маршрутов. Вы можете узнать больше о посредниках, прочитав полную документацию по посредникам.

Если запрос проходит через всех посредников, назначенных определенному маршруту, то метод маршрута или контроллера будет выполнен, а ответ, возвращенный методом маршрута или контроллера, будет отправлен обратно через цепочку посредников маршрута.

Окончание

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

Наконец, как только ответ проходит через посредников, метод handle ядра HTTP возвращает объект ответа, а файл index.php вызывает метод send для возвращенного ответа. Метод send отправляет содержимое ответа в веб-браузер пользователя. Мы завершили наш путь через весь жизненный цикл запроса Laravel!

Сосредоточьтесь на поставщиках служб

Поставщики служб действительно являются ключом к начальной загрузке приложения Laravel. Экземпляр приложения создается, поставщики служб регистрируются, и запрос передается загружаемому приложению. Это действительно так просто!

Очень важно иметь четкое представление о том, как создается и загружается приложение Laravel через поставщиков служб. Поставщики служб для вашего приложения хранятся в каталоге app/Providers.

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