Жизненный цикл запроса
Введение
При использовании любого инструмента в «реальном мире» Вы чувствуете себя более уверенно, если понимаете, как этот инструмент работает. Разработка приложений ничем не отличается. Когда Вы понимаете, как работают Ваши инструменты разработки, Вы чувствуете себя более комфортно и уверенно с ними.
Цель этого документа - дать Вам хороший общий обзор того, как работает фреймворк 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-сессий, определяют, находится ли приложение в режиме обслуживания, проверяет токен 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
довольно пуст. Этот провайдер - отличное место для добавления собственных привязок начальной загрузки Вашего приложения и контейнеров служб. Для больших приложений Вы можете захотеть создать несколько сервис провайдеров, каждый с более детальной загрузкой для определенных сервисов, используемых Вашим приложением.