Зачем использовать шаблоны?
- Зачем нужна система шаблонов в PHP?
- Чем Latte лучше Twig или Blade?
- Что такое экранирование?
- Можно ли выполнить запрос к базе данных из шаблона Latte?
- В чём главные различия между системами шаблонов Latte, Twig и Blade?
- Стоит ли компаниям использовать систему шаблонов?
- Влияет ли Latte на производительность веб-приложений?
Зачем нужна система шаблонов в 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-сущность
<. Благодаря этому браузер правильно отображает символ
<.
Простой пример экранирования прямо при написании 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 перекомпилируются каждый раз при изменении их содержимого, поэтому разработчик всегда видит актуальную версию.