Введение
При использовании любого инструмента в «реальном мире» вы чувствуете больше уверенности, когда понимаете, как работает этот инструмент. Разработка приложений — не исключение. Когда вы понимаете, как функционируют ваши средства разработки, вы чувствуете себя более комфортно и уверенно. Задача этого документа состоит в том, чтобы дать вам хороший поверхностный обзор того, как «работает» фреймворк Laravel. Чем лучше вы знаете фреймворк, тем меньше в нём остаётся «волшебства», и вы более уверенно создаёте приложения. В дополнение к поверхностному обзору прохождения запроса мы рассмотрим старт-файлы и события приложения.
Не отчаивайтесь, если не всё сразу поймёте! Постарайтесь просто получить базовое понимание того, что происходит, и ваши знания будут расти по мере изучения других разделов документации.
добавлено в 4.1 ()
Прохождение запроса
Все запросы в вашем приложении управляются через сценарий public/index.php. При использовании Apache файл .htaccess, который поставляется с Laravel, обрабатывает передачу всех запросов в index.php. С этого момента Laravel начинается процесс обработки запроса и возврата ответа клиенту. Будет полезно получить общее представление о процессе автозагрузки Laravel, поэтому сейчас рассмотрим это!
Наиболее важным понятием при изучении процесса автозагрузки Laravel является поставщик услуг. Вы можете найти список поставщиков услуг в вашем конфигурационном файле app/config/app.php в массиве providers. Эти поставщики служат в качестве основного механизма автозагрузки для Laravel. Но прежде, чем мы окунёмся в поставщиков услуг, давайте вернёмся к index.php. После того, как запрос попадёт в ваш файл index.php, будет загружен файл bootstrap/start.php. Этот файл создаёт новый объект Laravel PHPApplication
, который также служит в качестве IoC-контейнера.
После создания объекта PHPApplication
, будут заданы несколько путей проекта и будет выполнено определение окружения. Далее будет вызван внутренний сценарий автозагрузки Laravel. Этот файл находится глубоко внутри Laravel и задаёт ещё несколько настроек на основе ваших конфигурационных файлов, например, часовой пояс, сообщения об ошибках и т.д. Но кроме установки этих довольно тривиальных параметров конфигурации, он также делает кое-что очень важное: регистрирует всех поставщиков услуг, настроенных для вашего приложения.
Простые поставщики услуг имеют только один метод — PHPregister()
. Этот метод PHPregister()
вызывается, когда поставщик услуг зарегистрирован с помощью объекта приложения через собственный метод PHPregister()
приложения. В этом методе поставщик услуг регистрирует вещи с помощью IoC-контейнера. По сути, каждый поставщик услуг привязывает одну или более функцию-замыкание) к контейнеру, что позволяет вам получать доступ к этим привязанным услугам в вашем приложении. Например, PHPQueueServiceProvider
регистрирует функции-замыкания, которые извлекают различные классы, связанные с очередями. Конечно поставщики услуг могут использоваться для любых задач автозагрузки, а не только для регистрации вещей в контейнерах IoC. Поставщик услуг может регистрировать обработчики событий, построители представлений, команды Artisan и многое другое.
После того как все поставщики услуг зарегистрированы, будут загружены ваши файлы app/start. Последним будет загружен ваш файл app/routes.php. Когда файл routes.php загружен, объект запроса отправляется в приложение, и может быть отправлен в маршрут.
Давайте подытожим:
1. Запрос заходит в файл public/index.php.
2. Файл bootstrap/start.php создаёт приложение и определяет окружение.
3. Внутренний файл framework/start.php устанавливает настройки и загружает поставщиков услуг.
4. Загружаются файлы приложения app/start.
5. Загружаются файлы приложения app/routes.php.
6. Объект запроса посылается в приложение, которое возвращает объект отклика.
7. Объект отклика посылается обратно клиенту.
Теперь, когда вы хорошо представляете, как обрабатывается запрос в приложении Laravel, давайте поближе рассмотрим старт-файлы!
Старт-файлы
Файлы запуска, или старт-файлы вашего приложения хранятся в папке app/start. По умолчанию создано три таких файла: global.php, local.php и artisan.php. Для информации об artisan.php см. соответствующий раздел.
Файл global.php изначально содержит несколько начальных вызовов, таких как регистрация журнала и подключение app/filters.php. Однако вы можете добавить сюда всё, что вам нужно. Этот файл автоматически выполняется при каждом запросе вне зависимости от среды, в которой выполняется ваше приложение.
Файл local.php вызывается только, когда приложение работает в среде local. Больше информации о средах можно найти в разделе о настройках.
Конечно, если у вас определены другие среды, кроме local, вы можете создать старт-файлы для любой из них. Они будут автоматически загружаться, когда приложение работает в соответствующей среде. Например, если в вашем файле bootstrap/start.php определена среда development, то вы можете создать файл app/start/development.php, который будет подключаться при поступлении в приложение любого запроса в этой среде.
Что помещать в старт-файлы
Старт-файлы служат в качестве простого места для размещения любого кода «автозагрузки». Например, вы можете зарегистрировать построитель представлений, настроить ведение логов, установить некоторые параметры PHP и т.д. Это полностью зависит от вас. Конечно, перемещение всего вашего кода автозагрузки в старт-файлы может привести к загромождению. Для больших приложений, или если вы чувствуете, что ваши старт-файлы загромождаются, задумайтесь о переносе некоторого кода автозагрузки в поставщики услуг.
События
Регистрация обработчиков событий
Вы также можете делать пред- или пост-обработку запросов регистрируя обработчики для событий before, after, finish и shutdown:
App::before(function($request)
{
//
});
App::after(function ($request, $response) {
//
});
Эти обработчики будут запущены соответственно до и после каждого вызова в вашем приложении. Эти события полезны для глобальной фильтрации и глобальной модификации откликов. Вы можете зарегистрировать их в одном из ваших старт-файлов или в поставщике услуг.
добавлено в 4.1 ()
Вы также можете зарегистрировать обработчик для события matched, которое срабатывает, когда входящий запрос соответствует ещё не выполненному маршруту:
Route::matched(function($route, $request)
{
//
});
Событие finish вызывается после отправки отклика от вашего приложения обратно клиенту. Это хороший момент, чтобы сделать какие-либо окончательные действия, требуемые для вашего приложения. Событие shutdown вызывается сразу после того, как все обработчики события finish завершат работу, и это последняя возможность сделать какую-то работу, прежде чем сценарий завершится. Скорее всего, у вас не будет необходимости использовать эти события.