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 е комбинация от приятно и полезно.

*Първо, приятните:* 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 е комбинация от приятно и полезно.

Първо, приятните: 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 се прекомпилират всеки път, когато съдържанието им се промени, така че разработчикът винаги вижда актуалната версия.