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

Введение

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

Цель этого документа - дать вам хороший высокоуровневый взгляд на то, как работает фреймворк Laravel.

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

Обзор

Первые шаги

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

index.php загружает созданный Composer-ом автозагрузчик классов и при помощи bootstrap/app.php создает $app - объект приложения, или сервис-контейнер.

Ядро обработки HTTP- и консольных запросов

Далее запрос поступает или в ядро обработки HTTP-запросов или в ядро обработки консольных запросов - в зависимости от того, откуда пришел запрос. Для примера остановимся на HTTP-ядре, app/Http/Kernel.php.

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

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

HTTP-ядро - это как некий черный ящик. Принимает на вход Request (запрос) и отдает Response (ответ).

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

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

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

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

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

Сервис-провайдер - ключевая вещь фреймворка, ключ к пониманию процесса загрузки (bootstrapping) вашего приложения.

Ваши сервис-провайдеры находятся в папке app/Providers. Дефолтный стартовый сервис-провайдер приложения AppServiceProvider не содержит почти ничего, его должны заполнить вы - регистрацией сервис-провайдеров модулей, биндингами в сервис-контейнер своих классов и фасадов и т.д.