Зачем использовать шаблоны?
Почему я должен использовать систему шаблонов в PHP?
Зачем использовать систему шаблонов в PHP, если PHP сам является языком шаблонов?
Давайте сначала кратко вспомним историю этого языка, которая полна интересных поворотов. Одним из первых языков программирования, использовавшихся для генерации HTML-страниц, был язык Си. Однако вскоре стало очевидно, что использовать его для этих целей нецелесообразно. Поэтому Расмус Лердорф создал 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:attributes. Или возможность проверки ссылок. И многое другое.
Что такое экранирование?
Эскейпинг – это процесс замены символов со специальным значением на
соответствующие последовательности при вставке одной строки в другую
для предотвращения нежелательных эффектов или ошибок. Например, при
вставке строки в HTML-текст, в которой символ <
имеет специальное
значение, поскольку обозначает начало тега, мы заменяем его
соответствующей последовательностью, которой является HTML-сущность
<
. Это позволяет браузеру правильно отобразить символ
<
.
Простым примером экранирования непосредственно при написании 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 перекомпилируются каждый раз, когда меняется их содержимое, поэтому разработчик всегда видит актуальную версию.