1. Архитектурные концепции
  2. Жизненный цикл запроса

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

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

Цель этого документа - предоставить вам хороший обзор работы фреймворка 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, который определяет массив "загрузчиков", которые будут запущены до выполнения запроса. Эти загрузчики настраивают обработку ошибок, настраивают ведение журнала, определяют окружение приложения и выполняют другие задачи, которые необходимо выполнить до обработки запроса. Обычно эти классы обрабатывают внутреннюю конфигурацию Laravel, о которой вам не нужно беспокоиться.

HTTP-ядро также определяет список HTTP-промежуточного программного обеспечения (middleware), через которое должны проходить все запросы перед обработкой приложением. Эти промежуточные программы обрабатывают чтение и запись HTTP-сессии, определение того, находится ли приложение в режиме обслуживания, проверку маркера CSRF и многое другое. Мы поговорим о них подробнее вскоре.

Сигнатура метода handle HTTP-ядра довольно проста: он принимает Request и возвращает Response. Представьте ядро как большой черный ящик, представляющий собой ваше целое приложение. Подающиеся ему HTTP-запросы приведут к возврату HTTP-ответов.

Службы-поставщики

Одним из самых важных этапов загрузки ядра является загрузка служб-поставщиков (service providers) для вашего приложения. Службы-поставщики отвечают за запуск всех различных компонентов фреймворка, таких как база данных, очередь, валидация и маршрутизация. Все службы-поставщики для приложения настраиваются в массиве 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 довольно пуст. Этот поставщик отличное место, чтобы добавить собственную начальную загрузку и привязки контейнера служб. Для крупных приложений вы можете создавать несколько служб-поставщиков, каждый с более детализированной начальной загрузкой для конкретных служб, используемых вашим приложением.