Зачем использовать шаблоны?

Зачем нужна система шаблонов в PHP?

Зачем использовать систему шаблонов в PHP, если сам PHP является языком шаблонов?

Давайте сначала коротко вспомним историю этого языка, полную интересных поворотов. Одним из первых языков программирования, применявшихся для генерации HTML-страниц, был C. Однако вскоре стало ясно, что использовать его для этой цели непрактично. Поэтому Расмус Лердорф создал PHP, который упростил генерацию динамического HTML при помощи C на стороне сервера. Изначально PHP задумывался как язык шаблонов, но со временем оброс дополнительными возможностями и стал полноценным языком программирования.

Тем не менее он по-прежнему работает и как язык шаблонов. PHP-файл может содержать HTML-страницу, в которой переменные выводятся с помощью <?= $foo ?> и подобных конструкций.

На заре истории PHP появилась система шаблонов Smarty, цель которой была в строгом разделении представления (HTML/CSS) и логики приложения. Она намеренно предоставляла более ограниченный язык, чем сам PHP, чтобы разработчик не мог, например, выполнить запрос к базе данных прямо из шаблона. С другой стороны, она означала дополнительную зависимость в проектах, увеличивала их сложность и требовала от программистов изучения нового языка Smarty. Выгода была спорной, и для шаблонов по-прежнему использовали чистый PHP.

Со временем системы шаблонов начали приносить реальную пользу. Они принесли такие концепции, как наследование, режим песочницы и ряд других возможностей, которые заметно упростили создание шаблонов по сравнению с чистым PHP. На первый план вышла тема безопасности, существование уязвимостей вроде XSS и необходимость экранирования. Системы шаблонов ввели автоматическое экранирование, чтобы исключить риск того, что программист о нём забудет и создаст серьёзную дыру в безопасности (вскоре мы увидим, что у этого есть свои подводные камни).

Сегодня преимущества систем шаблонов значительно перевешивают затраты на их внедрение. Поэтому использовать их имеет смысл.

Чем Latte лучше Twig или Blade?

Причин несколько: часть из них про удобство, часть про принципиальную пользу. Latte сочетает и то, и другое.

Сначала о приятном: у Latte такой же синтаксис, как у PHP. Единственное отличие в записи тегов: вместо <?= и ?> используются более короткие { и }. Это значит, что вам не придётся учить новый язык. Затраты на обучение минимальны. А главное, во время разработки вам не нужно постоянно “переключаться” между языком PHP и языком шаблонов, ведь это одно и то же. В отличие от шаблонов Twig, которые используют синтаксис в духе Python и вынуждают программиста переключаться между двумя разными языками.

Теперь о невероятно полезном: все системы шаблонов, такие как Twig, Blade или Smarty, со временем обзавелись защитой от XSS в виде автоматического экранирования. Точнее говоря, автоматического вызова функции htmlspecialchars(). Но создатели Latte поняли, что это вовсе не правильное решение. Дело в том, что разные части документа требуют разных способов экранирования. Наивное автоматическое экранирование опасно, потому что создаёт ложное чувство безопасности.

Чтобы автоматическое экранирование работало и было надёжным, оно должно распознавать, в каком месте документа выводятся данные (мы называем эти места контекстами), и выбирать функцию экранирования соответственно. То есть оно должно быть контекстно-зависимым. И Latte это умеет. Он понимает HTML. Он воспринимает шаблон не как простую строку символов, а знает, что такое теги, атрибуты и так далее. Поэтому он экранирует по-разному в HTML-тексте, внутри HTML-тегов, внутри JavaScript и так далее.

Latte – первая и единственная система шаблонов для PHP с контекстно-зависимым экранированием. Это единственная по-настоящему безопасная система шаблонов.

И ещё одна приятная причина: поскольку Latte понимает HTML, он предлагает и другие очень удобные возможности. Например, n:атрибуты. Или возможность проверять ссылки. И многое другое.

Что такое экранирование?

Экранирование – это процесс замены символов со специальным значением на соответствующие последовательности при вставке одной строки в другую, чтобы предотвратить нежелательные эффекты или ошибки. Например, при вставке строки в HTML-текст, где символ < имеет специальное значение (обозначает начало тега), мы заменяем его на соответствующую последовательность, то есть на HTML-сущность &lt;. Благодаря этому браузер правильно отображает символ <.

Простой пример экранирования прямо при написании PHP-кода: вставка кавычки в строку с предшествующим обратным слешем.

Подробнее об экранировании мы говорим в главе Как защититься от XSS.

Можно ли выполнить запрос к базе данных из шаблона Latte?

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

Другая ситуация возникает, если вы хотите дать возможность редактировать шаблоны клиентам или внешним верстальщикам. В этом случае вы точно не хотите, чтобы у них был доступ к базе данных. Разумеется, объект базы данных вы в шаблон не передадите, но что если до него можно добраться через другой объект? Решением служит режим песочницы, который позволяет определить, какие методы можно вызывать в шаблонах. Благодаря этому вам не придётся беспокоиться о нарушении безопасности.

В чём главные различия между системами шаблонов Latte, Twig и Blade?

Различия между системами шаблонов Latte, Twig и Blade лежат прежде всего в синтаксисе, безопасности и интеграции с фреймворками:

  • Latte: использует синтаксис PHP, поэтому его легко изучать и применять. Обеспечивает первоклассную защиту от XSS-атак благодаря контекстно-зависимому экранированию. Хорошо интегрирован с Nette Framework, но пригоден и для самостоятельного использования.
  • Twig: использует синтаксис в духе Python, который значительно отличается от PHP. Экранирует без учёта контекста (обычный htmlspecialchars). Хорошо интегрирован с фреймворком Symfony.
  • Blade: использует смесь PHP и собственного синтаксиса. Экранирует без учёта контекста (обычный htmlspecialchars). Тесно интегрирован с возможностями и экосистемой Laravel.

Стоит ли компаниям использовать систему шаблонов?

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

Кроме того, Latte обеспечивает высокий уровень защиты от XSS-уязвимостей благодаря уникальной технологии контекстно-зависимого экранирования. Эта защита критически важна для безопасности веб-приложений и минимизации риска атак, которые могли бы поставить под угрозу пользователей или данные компании. Безопасность веб-приложений важна и для репутации компании. Проблемы с безопасностью могут привести к потере доверия клиентов и повредить имиджу компании на рынке.

Использование Latte также снижает общие затраты на разработку и поддержку, потому что упрощает и то, и другое. Так что использовать систему шаблонов определённо стоит.

Влияет ли Latte на производительность веб-приложений?

Хотя шаблоны Latte обрабатываются быстро, в продакшене этот аспект на самом деле не имеет значения. Причина в том, что файлы шаблонов разбираются только один раз, при первом отображении. Затем они компилируются в нативный PHP-код, сохраняются на диск и выполняются при каждом последующем запросе без повторной компиляции.

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

версия: 3.x