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

Зачем использовать систему шаблонов в 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.
  • Twig: использует синтаксис языка Python, который довольно сильно отличается от PHP. Экранирует без различения контекста. Хорошо интегрирован во фреймворк Symfony.
  • Blade: использует смесь PHP и собственного синтаксиса. Экранирует без различения контекста. Тесно интегрирован с функциями и экосистемой Laravel.

Выгодно ли компаниям использовать систему шаблонов?

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

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

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

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

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

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

версия: 3.0