В последнее время я много работал с различными шаблонизаторами. Для последнего проекта требовалось повторное использование одного и того же набора шаблонов в приложениях JS и PHP (в сочетании с History API обеспечивается бесшовное динамическое поведение, но все еще имеющее сырой вид). На самом деле, сегодня есть только одно решение для такого рода задач — шаблонизатор Mustache. Я многому научился, работая с Mustache, и он действительно изменил мою точку зрения на сложные конструкции кода.В прошлом
Если бы вы поговорили со мной два года назад, я бы сказал вам, что применение шаблонизаторов в PHP излишне. Вы должны использовать только чистый PHP. Я обосновывал это тем, что шаблонизатор (например, Smarty) предоставляет так мало возможностей, что трудно оправдать этим снижение производительности и другой синтаксис. В то же время, шаблонизаторы даже толком не умеют пропускать ваши переменные (вы должны были добавить собственный фильтр для каждой переменной). В конце концов, какая польза от использования шаблонизаторов кроме синтаксиса?
Потом я нашел Twig. Я увидел у него функцию автоматического пропуска переменных и мгновенно купил. Хотя я не совсем был готов оставить чистый PHP, я начал рекомендовать людям использовать Twig. Основная причина использования шаблонизаторов вместо чистого PHP состоит в том, что Twig имел хороший синтаксис и хороший код. А лучше всего то, что он был простым!
Но затем, в течение последних месяцев, я начал замечать, что некогда очень простой шаблонизатор начал расти. Теперь он поддерживает все виды возможностей. Он поддерживает подключение к парсеру для определения собственного DSL (Domain Specific Languages). Он поддерживает множественное наследование. Может быть, он поддерживал все это и раньше, а я просто не замечал. Но сейчас я чувствую, что Twig стал слишком тяжелым и громоздким…
Другим важным моментом является то, что я никогда не тестировал свои приложения. Я бы мог реализовать тестирование с помощью Selenium (или других инструментов). Но мне он никогда не нравился. Важным недостатком является то, что в нем не предусмотрена возможность запуска тестовых наборов. И никогда по-настоящему не имел преимуществ ни в чем, кроме простоты использования.
Пользуйтесь Mustache
Я задействовал шаблонизатор Mustache в основном на сторонних проектах, но никогда не использовал его для чего-либо серьезного. Тогда, совсем недавно, я применил его в работе над новым приложением. Мое первое впечатление — шаблонизатор неудобен в использовании. В конце концов вы будете работать только с логикой: циклом foreach и if-but-not-really-an-if структурой (они же и операторы). Из-за этого ограничения данные, которые есть в шаблоне, должны быть структурированы очень специфическим образом.
Я нашел один интересный подход. Так как сам шаблон не имеет логики, то происходит преобразование. А если это просто преобразование, то нет ничего, что можно было бы в нем протестировать. Вместо этого я представил всю логику в виде объектов. И что вы думаете? Этот объект на самом деле довольно легко тестируется! Охват объектов увеличился, а качество самих тестов значительно улучшилось!
Не инструмент, а подход
Здесь есть важный момент: инструмент не то, что мне помогло. Он только показал мне путь. Для меня благом было осознание того, что шаблон является просто преобразованием данных. Теперь Mustache применяет это ограничение, но в нем ничего, позволяющего сказать, что вы не можете сделать все это с любым другим инструментом.
Подход здесь прост: разделение на объект и шаблон. Объект работает на основе логики (получение данных из моделей, форматирование и любая другая логика представления), а затем передает эти данные в шаблон. Шаблон действует просто как преобразователь данных, принимая массив из одного формата и преобразовывая в другой. Вот и все.
Заключение
Основная цель использования шаблонизатора — отделение представления данных (дизайн, вёрстка) от логики (работа самой системы). Использование шаблонизаторов часто улучшает читаемость кода и упрощает внесение изменений во внешний вид.