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

Внимательный читатель заметил, что в нашем фреймворке захардкоден способ определения шаблона. Для простейших страничек, типа тех, которые мы создавали ранее — это не проблема. Но если вы захотите добавить немного логики — вам придется добавлять логику в сам шаблон, что, в общем, не самая хорошая идея.

Давайте разделим код шаблонов и логику, добавив новый слой: Контроллер. Задача контроллера — генерировать ответ, основываясь на информации, переданной клиентским запросом.

Измените часть фреймворка, отвечающую за отображение шаблонов следующим образом:

Так как отображение теперь производится внешней функцией (render_template()), нам нужно передать ей параметры, извлеченные из URL. Мы можем передать их как дополнительный аргумент в ф-ции render_template(), но вместо этого, давайте используем другую возможность компонента Request, которая называется attributes. Она позволяет вам добавить дополнительную информацию о запросе, которая не связанна на прямую с данными HTTP Request.

Теперь можно создать функцию render_template() — общий контроллер, который будет отображать шаблоны когда не требуются особой логики. Что бы не изменять сами шаблоны, параметры запроса извлекаются до того как происходит отображение.

Так как render_template() является аргументом функции call_user_func(), мы можем заменить ее любым валидным PHP callbacks. Что позволяет нам использовать в качестве контроллера — функцию, анонимную функцию, или метод класса… на ваш вкус.

По соглашению, для каждого маршрута, ассоциированный контроллер настраивается параметром _controller.

Теперь, любой маршрут может быть привязан к любому контроллеру, и конечно, внутри контроллера вы все еще можете использовать render_template() для отображения шаблона.

Этот подход отличается гибкостью, т.к. вы можете изменить объект Response и даже передать в шаблон дополнительные параметры.

Итак, обновленная и улучшенная версия нашего фреймворка:

А что бы отпраздновать это событие, давайте создадим новое приложение, которому нужно немного простой логики. Наше приложение состоит из одной странички, и показывает, високосный ли передан ему год, или нет. При вызове /is_leap_year, мы увидим ответ для текущего года. Но мы также можем вызвать /is_leap_year/2012. Существующий фреймворк для этого изменять не нужно, просто создайте новый app.php:

Функция is_leap_year() возвращает true — если год високосный, и false если нет. Если год не передан — проверяется текущий год. Сам контроллер довольно прост: он получает год из атрибутов запроса, передает его в функцию is_leap_year(), и, исходя из возвращаемого значения, создает объект Response.

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

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

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

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

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

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