Использование шаблонизатора при формировании представления (view) в контроллере
При формирования представления, по моему мнению, удобно использовать шаблонизаторы. У них есть много удобных и полезных возможностей, например, наследование шаблонов, фильтрация, функции, виджеты, переопределение блоков и так далее. Два из рассматриваемых нами фреймворков, а именно: Symfony и Laravel для формирования представлений предоставляют шаблонизаторы «из коробки», а вот Yii по умолчанию для этих целей использует чистый php, хотя не запрещает нам подключить и использовать в рамках фреймворка подходящий шаблонизатор.
Рассмотрим сначала как формируются шаблоны в Yii, а затем перейдём к рассмотрению вопроса использования в представлениях шаблонизаторов в рамках фреймворков Symfony и Laravel.
Yii view & native PHPИтак, как мы уже сказали, «из коробки» Yii предлагает в шаблонах использовать чистый PHP. Представления, которые мы будем использовать в контроллерах приложении располагаются в папке frontend/views. Для каждого контроллера в данной директории создаётся отдельная папка (например, для контроллера CompanyController нужно создать папку company), а внутри папки будут храниться шаблоны для экшенов, каждому экшену свой шаблон (для экшена actionShow создадим шаблон show.php, для actionIndex — index.php). Для базовых шаблонов существует папка frontend/views/layouts, по умолчанию ко всем шаблонам будет применяться базовый шаблон main.php. Чтобы задать другой базовый шаблон для контроллера, надо переопределить в нём свойство $layout, например:
Чтобы задать иной базовый шаблон по умолчанию для всех контроллеров, надо добавить параметр в «корень» конфигурации frontend/config/main.php:
Если вместо названия базового шаблона передать false, то базовый шаблон применять при формировании представления не будет.
Внесём изменения в CompanyController.php в методе actionIndex():
И создадим файл frontend/views/company/index.php с содержимым:
Хорошей практикой является указывать в начале view-файла в комментариях переменные, которые доступны для использования.
В базовом шаблоне main.php, который был у нас «из коробки», есть каркас html страницы, в котором используется поле title, а также реализованы breadcrumbs («хлебные крошки»). В нашем частном шаблоне index.php мы помимо вывода непосредственно списка компаний задаём также title и дополняем цепочку breadcrumbs ещё одним элементом (текущей страницей).
Теперь страница со списком компаний приобрела более благородный вид. Осталось создать подобные представления для остальных страниц нашего приложения.
Более подробно о представлениях в Yii можно узнать из документации: http://www.yiiframework.com/doc-2.0/guide-structure-views.html
Перейдём к рассмотрению шаблонизатора, используемого во фреймворке Symfony.
Шаблонизатор Twig в SymfonyФреймворк Symfony «из коробки» предлагает нам использовать в приложении довольно мощный шаблонизатор Twig. Согласно документации, каждый шаблон компилируется в PHP класс и затем кешируется, что обеспечивает довольно высокую скорость отображения шаблона.
Шаблоны, общие для всего приложения, хранятся в директории app/Resources/views/, шаблоны бандлов сторонних библиотек хранятся в vendor/path/to/CoolBundle/Resources/views/, а шаблоны бандла FunnyAppBundle будут храниться в директории src/Funny/AppBundle/Resources/veiws/. Для каждого контроллера в данной папке создаётся подпапка с названием контроллера, например, Company, в которой для каждого экшена создаётся отдельный шаблон с расширением *.html.twig, например для экшена listAction мы создадим шаблон list.html.twig.
Расширение базового шаблона app/Resources/views/base.html.twig происходит не средствами фреймворка, как в Yii, а средствами самого шаблонизатора, то есть чтобы расширить (extends) базовый шаблон, нужно в шаблоне src/Funny/AppBundle/Resources/veiws/Company/list.html.twig в начале файла указать:
Полностью файл list.html.twig будет выглядеть следующим образом:
Мы переопределяем два блока, определённые в базовом шаблоне: — текст из тега <title> и — основной контент страницы.
В данном примере, помимо возможности наследования шаблонов, продемонстрировано использование цикла , который аналогичен циклу foreach в PHP. Для вывода значения переменной или функции используется конструкция >.
Подобным образом нам необходимо создать шаблоны и для остальных экшенов.
О том, как работать с шаблонами в рамках Symfony, и базовую информацию о шаблонизаторе Twig можно узнать из официальной документации по Symfony: http://symfony.com/doc/current/templating.html
Более подробно с синтаксисом и возможностями шаблонизатора можно ознакомиться на сайте http://twig.sensiolabs.org/.
Рассмотрим теперь, как работает с шаблонами Laravel.
Laravel & шаблонизатор BladeLaravel предлагает нам использовать шаблонизатор Blade, который поставляется вместе с фреймворком. Согласно документации в шаблонизаторе Blade есть два основных преимущества: наследование шаблонов и секции. Рассмотрим данные преимущества на примере базового шаблона (layout) и шаблона списка компаний, который будет «расширять» базовый шаблон.
Все шаблоны будут располагаться в папке resources/views/, базовый шаблон будет располагаться непосредственно в данной директории, а шаблоны экшенов в поддиректориях.
Создадим базовый шаблон layout.blade.php:
Отличие директивы @yield от @section в том, что @yield будет выводить контент из секции, которую получит из шаблона наследника, а директива @section сразу задаёт некоторый контент, который в шаблоне-наследнике может быть переопределён или дополнен.
Шаблон для экшена CompanyController@index, который будет располагаться в директории resources/views/company/, мы назовём index.blade.php и поместим туда следующий код:
Директивой @extends мы задаём от какого шаблоны мы наследуемся, а дерективы @section задают контент для тех мест, где базовый шаблон будет запрашивать данные от шаблона наследника, а также расширяют контент в том месте, где он уже задан в базовом шаблоне. Чтобы получить данные из секции базового шаблона используется директива @parent.
Также в данном шаблоне продемонстрирована возможность использования циклов, в данном случае мы проходим по массиву, используя директиву @foreach. Для вывода значения переменных используется конструкция >.
Осталось поправить экшен index в контроллере CompanyController:
Для вывода данных с помощью шаблона используется глобальная функция (хелпер) view(), которая принимает в качестве первого параметра идентификатор шаблона, а вторым параметром при необходимости можно передать массив переменных, которые будут доступны в данном шаблоне.