За обновлениями можно следить в telegram-канале https://t.me/quasiart
Ведь, если звезды зажигают —
значит — это кому-нибудь нужно?
Владимир Маяковский

Введение

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

Зачем нужны шаблонизаторы?

Чем сложнее приложение, тем важнее разделять логику и представление. Только в случае успешного разделения логики от представления backend-разработчики смогут эффективно сотрудничать с frontend-разработчиками. Благодаря шаблонизаторам frontend-разработчики и верстальщики могут изменять внешний вид web-приложения, используя знакомый синтаксис. Обычно шаблоны представляют собой небольшие и в некотором роде независимые куски HTML, в которые опционально встроен вывод переменных, какие-то простые логические конструкции и так далее. 

<a href="{$uri}" class="{$classnames}" title="{$menutitle}">{$menutitle}</a>

Иногда фронт вообще написан на JavaScript, а общение с бэком происходит посредством API, но это совсем другая история. Эта статья о ситуации, когда вёрстка является частью монолитного приложения.

Список шаблонизаторов для сравнения

К шаблонизаторам применялись следующие критерии: они должны быть написаны на PHP, активно поддерживаться и быть признанными сообществом PHP.

Blade

Этот шаблонизатор используется в Laravel — популярном PHP-фреймворке, созданном примерно в 2011. По слухам, причиной скорости Blade является небольшой список регулярных выражений для замены. 

Laravel Github: https://github.com/laravel/laravel

Подписчики Звёздочки Форки
4 642 73 312 23 708

Blade также неофициально существует отдельно от Laravel, чтобы использовать с другим фреймворком, например: https://github.com/jenssegers/blade

<html>
    <head>
        <title>App Name - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Mustache

Mustache доступен для практически неограниченного количества языков, в том числе и PHP. Также он содержит минимум логики: замена, цикл foreach, проверка на null. 

Mustache.js: https://github.com/janl/mustache.js

Подписчики Звёздочки Форки
405 15 904 2 458

Mustache.php: https://github.com/bobthecow/mustache.php

Подписчики Звёздочки Форки
119 3 287 425

Hello {{name}}
You have just won {{value}} dollars!
{{#in_ca}}
Well, {{taxed_value}} dollars, after taxes.
{{/in_ca}}

Smarty

Smarty появился в начала нулевых, до сих пор развивается и конкурирует с более молодыми проектами.

Github: https://github.com/smarty-php/smarty

Подписчики Звёздочки Форки
183 2 094 473

<html>
<head>
<title>{$title}</title>
</head>
<body>
{* Comment  *}
{include file='content.tpl'}
</body>
</html>

Twig

Данный шаблонизатор обрёл свою популярность благодаря Фабьену Потенцеруб, внедрившему его в систему представлений фреймворка Symfony. Тем не менее, Twig может быть внедрён практически в любой проект независимо от фреймворка. 

Github: https://github.com/twigphp/Twig

Подписчики Звёздочки Форки
257 4 797 1 020

{{ foo }}
{# comment #}
{% if foo %}{% endif %}

Volt

Volt используется в фреймворке Phalcon (фреймворк, написанный на C и распространяемый как PHP-расширение). Из недостатков можно отметить лишь то, что Volt можно использовать только в Phalcon, то есть нет возможности использовать в проекте на другом фреймворке. 

Phalcon Github: https://github.com/phalcon/cphalcon

Подписчики Звёздочки Форки
752 9 460 1 734

{# app/views/products/show.volt #}

{% block last_products %}

{% for product in products %}
    * Name: {{ product.name|e }}
    {% if product.status === "Active" %}
       Price: {{ product.price + product.taxes/100 }}
    {% endif  %}
{% endfor  %}

{% endblock %}

Как выбрать шаблонизатор?

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

Blade

Синтаксис и функциональность

Blade поддерживает наследование шаблонов, секции, безопасный ввод содержимого и простой синтаксис. Blade разрешает использование PHP внутри шаблонов.

Документация и поддержка

Blade отлично документирован, но документация носит характер обзоров, в то время как более детальная информация содержится на сторонних ресурсах. 

Производительность

Во время теста скорость достигала 100 000 шаблонов в секунду. Но если учитывать обработку шаблонов вместе с загрузкой фреймворка, то скорость около 2 200 шаблонов в секунду. 

Mustache

Синтаксис и функциональность

Шаблоны Mustache не могут содержать логику, поэтому backend-разработчикам приходится реализовывать излишнюю логику, связанную с представлением. 

Документация и поддержка

Ввиду ограниченных возможностей Mustache не требуется большой и подробной документации. 

Smarty

Синтаксис и функциональность

Синтаксис лаконичен и прост для восприятия. Функционал большой и расширяемый. 

Документация и поддержка

Документация у Smarty хорошо организована. Сайт выглядит немного устаревшим, но это является проблемой. 

Производительность

Smarty довольно быстро обрабатывает некэшируемые шаблоны (9 634 шаблонов в секунду) and ещё быстрее — кэшируемые (57 115 шаблонов в секунду). 

Twig

Синтаксис и функциональность

Twig поставляется с полным набором функций, фильтров, тестов и расширяемых макросов.

Документация и поддержка

Документация отлично организована, информативна и содержит наглядную информацию. Сообщество вокруг Twig большое, ведётся активная разработка на GitHub. Twig используется в Drupal 8, второй по популярности CMS. 

Производительность

Обработка некэшируемых шаблонов происходит со скоростью 4 318 шаблонов в секунду, а кэшированных — 5 982.

Volt

Синтаксис и функциональность

Volt очень похож на Twig. В нём доступен функционал для создания собственных фильтров, макросов и расширений движка.

Документация и поддержка

Документация чистая, информативная и наглядная. Разработка Volt, как и Phalcon, идёт на GitHub полным ходом.

Производительность

Ввиду того, что фреймворк написан на C, Volt обрабатывает 23 900 шаблонов в секунду и вдвое больше при включении кэширования. 

Выводы

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