Nette Documentation Preview

syntax
Навіщо використовувати шаблони?
*******************************


Навіщо використовувати систему шаблонів в PHP? .[#toc-why-should-i-use-a-templating-system-in-php]
--------------------------------------------------------------------------------------------------

Навіщо використовувати систему шаблонів в PHP, якщо PHP сам по собі є мовою шаблонів?

Давайте спочатку коротко згадаємо історію цієї мови, яка сповнена цікавих поворотів. Однією з перших мов програмування, яка використовувалася для створення HTML-сторінок, була мова C. Однак незабаром стало очевидно, що використовувати її для цієї мети недоцільно. Таким чином, Расмус Лердорф створив 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 має такий самий [синтаксис, як і 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-сторінок, була мова C. Однак незабаром стало очевидно, що використовувати її для цієї мети недоцільно. Таким чином, Расмус Лердорф створив PHP, який полегшив генерацію динамічного HTML за допомогою мови C на серверній стороні. Спочатку PHP був розроблений як мова шаблонів, але з часом він набув додаткових можливостей і став повноцінною мовою програмування.

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

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

З часом шаблонні системи почали ставати корисними. Вони запровадили такі поняття, як успадкування, режим пісочниці та низку інших функцій, які значно спростили створення шаблонів порівняно з чистим PHP. Тема безпеки, існування вразливостей на кшталт XSS та необхідності ескейпінгу вийшла на перший план. Шаблонні системи запровадили автоматичне екранування, щоб усунути ризик того, що програміст забуде про нього і створить серйозну діру в безпеці (незабаром ми побачимо, що це має певні підводні камені).

Сьогодні переваги шаблонних систем значно перевищують витрати, пов'язані з їх розгортанням. Тому є сенс їх використовувати.

Чому Latte краще, ніж Twig або Blade?

Є кілька причин – деякі з них приємні, а інші надзвичайно корисні. Латте – це поєднання приємного та корисного.

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