Создаем свой Фреймворк на компонентах symfony2. Часть 11

Если бы вы использовали наш фреймворк прямо сейчас, вы бы наверняка задумались о поддержке кастомных сообщений об ошибках. Мы уже имеем обработку для ошибок 404 и 500, но способ обработки захардкоден во фреймворке. Сделать их кастомизацию — легче легкого, достаточно определить новое событие, и слушателя, который будет вызывать по этому событию определенный контроллер. Вроде все просто, но, что если, в этом контроллере выбросить исключение? Вы получите бесконечный цикл! Не самый лучший вариант правда?

Посмотрим на класс HttpKernel, который является универсальной, расширенной и гибкой имплементацией интерфейса HttpKernelInterface. Этот класс очень похож на класс фреймворка, который мы пишем. Он управляет событиями в некоторых важных участках кода в процессе обработки запроса. Он использует Controller resolver, для сопоставления контроллера запросу. И в качестве бонуса, он предоставляет отличную обратную связь, при возникновении проблем.

Итак, новый код фреймворка:

Добавим новый front controller

RouterListener — предоставляет ту же логику, что мы использовали в нашем фреймворке: он анализирует входящий запрос, и заполняет атрибуты объекта request параметрами маршрута.

Теперь наш код более компактный, и, внезапно, более надежный и функциональный чем раньше! Например можно использовать встроенный ExceptionListener, для комфортного управления ошибками:

ExceptionListener, для простого и удобного управления исключениями предоставляет нам объект FlattenException, вместо обычного выбрасывания Exception. Он принимает любой валидный контроллер в качестве обработчика ошибок, так что вы можете создать ErrorController вместо использования анонимной функции.

Error controller выглядит следующим образом:

Вуаля! Удобное и гибкое управление ошибками, без всяких усилий! И конечно, если ваш контроллер выбросит исключение, HttpKernel его легко обработает.

Теперь давайте создадим слушателя, который позволит контроллерам возвращать текстовые строки, вместо полноценного объекта Response.

Что бы реализовать эту функцию, нам нужно слушать событие kernel.view, которое происходит сразу после вызова контроллера. Смысл в том, что бы превратить значение возвращаемое контроллером в объект Response, если, конечно, требуется.

Код получился довольно простым, потому что событие kernel.view происходит только кода контроллер возвращает значение, не являющееся объектом Response.

Не забудьте зарегистрировать подписчика во фронт-контроллере.

Если вы все же забудете зарегистрировать подписчика, HttpKernel выбросит красивое исключение “The controller must return a response (Да, это високосный год! given).”.

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

Надеюсь, сейчас вам понятно почему с виду простой интерфейс HttpKernelInterface является таким мощным. Реализация HttpKernel дает вам огромное количество отличного функционала, готового для комфортного использования прямо “из коробки”. А учитывая, что HttpKernel это по сути код, который используется в Symfony2 и Silex — вы получаете лучшее из двух миров: гибкий фреймворк заточенный под ваши нужды, но основанный на надежной, поддерживаемой, безопасной, масштабируемой низкоуровневой архитектуре, проверенной огромным количеством проектов.

К содержанию >>
Оригинал статьи на английском языке >>
Исходный код из статьи >>

Не забудьте поделиться статьей с друзьями

Подписывайтесь на меня в соц. сетях

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *