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

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

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

Давайте спочатку коротко розглянемо історію цієї мови, яка сповнена цікавих поворотів. Однією з перших мов програмування, що використовувалися для генерації HTML-сторінок, була мова C. Однак незабаром з'ясувалося, що її використання для цієї мети є непрактичним. Тому Расмус Лердорф створив PHP, який полегшив генерацію динамічного HTML з мовою C на бекенді. Отже, PHP спочатку був розроблений як мова шаблонів, але з часом отримав додаткові функції і став повноцінною мовою програмування.

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

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

З часом системи шаблонів почали ставати корисними. Вони прийшли з концепцією успадкування, режимом sandbox та низкою інших функцій, які значно спростили створення шаблонів порівняно з чистим 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 виконати запит до бази даних із шаблону?

У шаблонах можна працювати з об'єктами, які до них передає програміст. Якщо програміст хоче, він може передати в шаблон об'єкт бази даних і виконати над ним запит. Якщо у нього є такий намір, немає причин йому в цьому заважати.

Інша ситуація виникає, якщо ви хочете надати можливість редагувати шаблони клієнтам або зовнішнім кодерам. У такому випадку ви точно не хочете, щоб вони мали доступ до бази даних. Звичайно, ви не передасте об'єкт бази даних шаблону, але що, якщо до неї можна отримати доступ через інший об'єкт? Рішенням є режим sandbox, який дозволяє визначити, які методи можна викликати в шаблонах. Завдяки цьому вам не потрібно турбуватися про порушення безпеки.

Які основні відмінності між системами шаблонів, такими як 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