Любите загадки? Событие еще доступно на сайте.
Примите наш вызов и улучшите свои навыки!
Примите наш вызов и улучшите свои навыки!

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

Введение

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

Задача этого документа – дать вам хороший поверхностный обзор того, как работает фреймворк Laravel. Чем лучше вы узнаете фреймворк, тем меньше в нем остается “волшебства”, и тем более уверенно вы будете создавать приложения. Не отчаивайтесь, если не поймете всё сразу! Постарайтесь просто получить базовое понимание того, что происходит, и ваши знания будут расти по мере изучения других разделов документации.

Обзор жизненного цикла

Первые шаги

Входная точка для всех запросов к приложению Laravel – файл public/index.php. Все запросы направляются в этот файл настройками вашего веб-сервера (Apache / nginx). Файл index.php не содержит много кода. Скорее, это просто отправная точка для загрузки всего остального фреймворка.

Файл index.php загружает автозагрузчик, который сгенерировал Composer, а затем извлекает экземпляр Laravel-приложения из скрипта bootstrap/app.php. Первое действие самого Laravel – создать экземпляр приложения / сервис-контейнера.

Ядра HTTP / Console

Затем входящий запрос посылается либо в HTTP-ядро, либо в ядро консоли, в зависимости от типа этого запроса. Эти два ядра служат центральным местом, через которое протекают все запросы. Пока давайте рассмотрим HTTP-ядро, которое расположено в app/Http/Kernel.php.

HTTP-ядро наследует класс Illuminate\Foundation\Http\Kernel, который определяет массив загрузчиков bootstrappers, которые будут запущены перед выполнением запроса. Эти загрузчики настраивают обработку ошибок, ведение журналов, определяют среду приложения и выполняют другие задачи, которые надо выполнить перед самой обработкой запроса.

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

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

Сервис-провайдеры

Одно из важнейших действий ядра при загрузке — загрузка сервис-провайдеров для вашего приложения. Все сервис-провайдеры настраиваются в конфиге config/app.php массива providers. Сначала будет вызван метод register для всех сервис-провайдеров, а когда все они будут зарегистрированы, будет вызван метод boot.

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

Выполнение запроса

Как только все сервис-провайдеры зарегистрированы и приложение загружено, Request поступает в роутер для обработки. Роутер отправит запрос по роуту или контроллеру, а также запустит посредника, соответствующего роуту.

Фокус на сервис-провайдеры

Сервис-провайдеры — поистине ключ к инициализации и настройке Laravel-приложения. Создаётся экземпляр приложения, регистрируются сервис-провайдеры, и запрос передается в загруженное приложение. Всё действительно просто!

Очень важно иметь хорошее понимание того, как Laravel-приложение строится и загружается через сервис-провайдеры. Конечно, сервис-провайдеры вашего приложения по-умолчанию хранятся в директории app/Providers.

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