{{TOC}} == Стандартный жизненный цикл == {{Image /packages/proger/habravel/uploads/53-lifecycle.jpg, width=90%, align=center}} Стандартный жизненный цикл состоит из следующих пунктов: 1. HTTP-запрос через ((док4:routing Роуты)) (Routes) поступает в Контроллер (Controller) 2. ((док4:controllers Контроллер)) осуществляет некоторые действия в зависимости от запроса и передает данные в Отображения (Views) 3. ((док4:templates Отображения)) отображают полученные данные заданным образом, обеспечивая HTTP-ответ. Есть много отклонений и различных вариантов вышеприведенной схемы, но она дает нам три опорные точки, на которые надо обратить внимание: 1. Роуты - %%(t)app/routes.php%% 2. Контроллеры - %%(t)app/controllers/%% 3. Отображения - %%(t)app/views/%% "Отклонения" могут быть, например, такими: 1. Роуты могут возвращать Отображения или сам ((док4:responses Ответ)) (объект Response), без задействования Контроллеров. 2. До или после Роутов могут срабатывать ((док4:routing#фильтры Фильтры)) (%%(t)app/filters.php%%) 3. В процесс могут вмешаться ((док4:errors Исключения)) (Exceptions) или ошибки приложения. 4. Отклики на события. == Копнем глубже == Более глубокое понимание жизненного цикла запроса в Laravel позволит вам понять, где именно можно (и стоит) писать ваш код. Цикл запроса можно разбить на три части: **Загрузка** (Loading), **Инициализация** (Booting) и **Выполнение** (Running). === Загрузка (Loading) === {{Image /packages/proger/habravel/uploads/53-bootstrap1.jpg, width=90%, align=center}} Вот три основные области, где ваше приложение может повлиять на процесс загрузки фреймворка: 1. Пакеты Workbench. Workbench - это способ организовывать свой код в обособленные пакеты и тестировать их внутри вашего приложения перед тем как сделать их пакетами, распространяемыми через Composer. См. ((док4:packages документацию)). 2. Среда выполнения. В зависимости от установки среды, будут загружены те или иные конфиги, те или иные старт-файлы. 3. Пути. Редактируя %%(t)bootstrap/paths.php%% вы можете изменить файловую структуру фреймворка, расположив файлы в удобных для вас местах. === Инициализация (Booting) === {{Image /packages/proger/habravel/uploads/53-bootstrap2.jpg, width=90%, align=center}} Есть 10 областей, где вы можете влиять на процесс инициализации фреймворка. = Файлы настроек == ((док4:configuration Файлы настроек)) влияют и на процесс инициализации и на процесс работы фреймворка. = Сервис-провайдеры (Service Providers) == Любые ((док4:ioc#поставщики сервис-провайдеры)), которые вы создали или подсоединили к своему приложению в конфиге %%(t)config/app.php%% загружаются в начале процесса инициализации. Если сервис-провайдер не отложенный, вызывается его метод %%register()%%. = Загрузка и применение старт-файлов == Регистрируются старт-файлы, которые надо загрузить, когда будет вызвано событие %%(t)booted%%. = Стэк middleware разворачивается вниз == ((4 Middleware)) вложены один в другой как матрешки. Верхний middeware обрабатывает запрос и вызывает middleware следующего уровня, и так далее. Последний middleware вызывает приложение. Все middlewares заносятся в стек, и будут вызваны снова в конце части **Выполнения** (Running). = Инициализация сервис-провайдеров == Вызывается метод %%boot()%% у всех зарегистрированных не-отложенных сервис-провайдеров. = Функции обратного вызова пре-инициализации == Вызываются все функции-замыкания, зарегистрированные в %%App::booting()%% = Функции обратного вызова пост-инициализации == Вызываются все функции-замыкания, зарегистрированные в %%App::booted()%%. Загружаются старт-файлы, зарегистрированные на шаге 3. = Глобальные старт-файлы == Первым делом это %%(t)app/start/global.php%%, затем, если исполняется ((док4:artisan))-команда, то %%(t)app/start/artisan.php%%. = Старт-файл среды выполнения == Исполняется файл, который имеет то же имя файла, что и название среды выполнения - %%(t)app/start/{environment}.php%% = Маршруты == Исполняется %%(t)app/routes.php%%. Этот файл вы будете редактировать наиболее часто в процессе разработки вашего приложения. === Выполнение (Running) === {{Image /packages/proger/habravel/uploads/53-bootstrap3.jpg, width=90%, align=center}} 10 областей, где вы можете влиять на процесс выполнения: = Режим обслуживания == Если вы зарегистрировали функцию-подписчик режима обслуживания и приложение находится в этом режиме, эта функция выполняется. = Фильтр %%(t)before%% уровня приложения == Если у вас есть фильтры, зарегистрированные в %%App::before()%%, они выполняются. = Фильтры %%(t)before%% в маршрутах == Если у вас есть фильтры %%(t)before%% в ((док4:routing маршрутах)), они выполняются. = Исполнение запроса == После разбора, к какому маршруту относится запрос, вызывается действие (метод) нужного контроллера или замыкание маршрута. = Фильтры %%(t)after%% в маршрутах == Если у вас есть фильтры %%(t)after%% в маршрутах, они выполняются. = Фильтр %%(t)after%% уровня приложения == Если у вас есть фильтры, зарегистрированные в %%App::after()%%, они выполняются. = Стек middleware разворачивается вверх == Это точка, где объект Response передается вверх по стеку middlewares. Каждый middleware может изменять этот объект. = Middleware shutdown == Если у вас есть middleware, которые реализуют %%TerminableInterface%%, вызывается метод %%shutdown()%% этих middleware. = Функции обратного вызова %%(t)finish%% == Если у вас есть функции, зарегистрированные в %%App::finish()%%, они выполняются. = Функции обратного вызова %%(t)shutdown%% == Если у вас есть функции, зарегистрированные в %%App::shutdown()%%, они выполняются.