Nette Documentation Preview

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


Почему я должен использовать систему шаблонов в PHP? .[#toc-why-should-i-use-a-templating-system-in-php]
--------------------------------------------------------------------------------------------------------

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

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

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

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

Со временем системы шаблонов начали становиться полезными. Они ввели такие понятия, как [наследование |template-inheritance], [режим песочницы |sandbox] и ряд других возможностей, которые значительно упростили создание шаблонов по сравнению с чистым PHP. На первый план вышла тема безопасности, существования таких [уязвимостей, как XSS |safety-first], и необходимости [экранирования |#What is escaping]. Шаблонные системы ввели автоэскейпинг, чтобы устранить риск того, что программист забудет его и создаст серьезную брешь в безопасности (вскоре мы увидим, что это имеет определенные недостатки).

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


Почему Latte лучше, чем Twig или Blade? .[#toc-why-is-latte-better-than-twig-or-blade]
--------------------------------------------------------------------------------------

Есть несколько причин - некоторые из них приятные, а другие - чрезвычайно полезные. Latte - это комбинация приятного и полезного.

*Сначала о приятном:* Latte имеет тот же [синтаксис, что и PHP |syntax#Latte Understands PHP]. Единственное различие заключается в обозначении тегов, предпочитая более короткие `{` и `}` вместо `<?=` и `?>`. Это означает, что вам не придется учить новый язык. Затраты на обучение минимальны. Самое главное, что во время разработки вам не придется постоянно "переключаться" между языком PHP и языком шаблонов, поскольку они оба одинаковы. Это отличается от шаблонов Twig, которые используют язык Python, заставляя программиста переключаться между двумя разными языками.

*А теперь о чрезвычайно полезной причине:* Все системы шаблонов, такие как Twig, Blade или Smarty, эволюционировали и включают защиту от XSS в виде автоматического [экранирования |#What is escaping]. Точнее, автоматического вызова функции `htmlspecialchars()`. Однако создатели Latte поняли, что это совсем не верное решение. Это связано с тем, что разные части документа требуют разных методов экранирования. Наивное автоматическое экранирование - это опасная функция, потому что она создает ложное чувство безопасности.

Чтобы автоэскейпинг был функциональным и надежным, он должен распознавать, в какой части документа выводятся данные (мы называем это контекстами), и выбирать функцию эскейпинга соответствующим образом. Поэтому она должна быть [чувствительной к контексту |safety-first#Context-Aware Escaping]. И это то, что может сделать Latte. Он понимает HTML. Он не воспринимает шаблон как просто строку символов, а понимает, что такое теги, атрибуты и т. д. Поэтому он по-разному экранирует в HTML-тексте, внутри HTML-тегов, внутри JavaScript и т.д.

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

*И еще одна приятная причина:* Поскольку Latte понимает HTML, он предлагает другие очень приятные возможности. Например, [n:attributes |syntax#n:attributes]. Или возможность [проверки ссылок |safety-first#Link checking]. И многое другое.


Что такое экранирование? .[#toc-what-is-escaping]
-------------------------------------------------

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

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

Более подробно мы обсуждаем экранирование в главе [Как защититься от XSS |safety-first#How to Defend Against XSS?].


Можно ли выполнить запрос к базе данных из шаблона Latte? .[#toc-can-a-database-query-be-executed-from-a-latte-template]
------------------------------------------------------------------------------------------------------------------------

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

Иная ситуация возникает, если вы хотите предоставить клиентам или внешним программистам возможность редактировать шаблоны. В этом случае вы определенно не захотите, чтобы они имели доступ к базе данных. Конечно, вы не будете передавать объект базы данных в шаблон, но что, если к нему можно получить доступ через другой объект? Решением является [режим песочницы |sandbox], который позволяет вам определить, какие методы могут быть вызваны в шаблонах. Благодаря этому вы можете не беспокоиться о нарушениях безопасности.


Каковы основные различия между такими системами шаблонов, как Latte, Twig и Blade? .[#toc-what-are-the-main-differences-between-templating-systems-like-latte-twig-and-blade]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

- Latte: использует синтаксис языка PHP, что делает его более простым в изучении и использовании. Он обеспечивает первоклассную защиту от XSS-атак.
- Twig: использует Python-подобный синтаксис, который значительно отличается от PHP. Он экранирует без различия контекста. Хорошо интегрирован с фреймворком Symfony.
- Blade: использует смесь PHP и пользовательского синтаксиса. Не различает контекст. Он тесно интегрирован с функциями и экосистемой Laravel.


Стоит ли компаниям использовать систему шаблонов? .[#toc-is-it-worth-it-for-companies-to-use-a-templating-system]
-----------------------------------------------------------------------------------------------------------------

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

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

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


Влияет ли Latte на производительность веб-приложений? .[#toc-does-latte-affect-the-performance-of-web-applications]
-------------------------------------------------------------------------------------------------------------------

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

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

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

Почему я должен использовать систему шаблонов в 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-сущность &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 перекомпилируются каждый раз, когда меняется их содержимое, поэтому разработчик всегда видит актуальную версию.