Latte: как да работим с типовата система?
Типова система. Ключов въпрос за разработването на стабилни приложения, в който PHP придоби голяма преднина пред динамичните езици като Python, Ruby или JavaScript. От самото начало Nette Framework насочва програмистите към типово и стриктно програмиране. Latte 2.7 донесе поддръжка на типове и в шаблоните.

Благодарение на това, че знаем какъв тип данни или обект има във всяка променлива, може:
- IDE да подсказва правилно
- статичният анализ да открива грешки
Две точки, които фундаментално повишават качеството и удобството на разработката.
Как да декларираме типове от страна на PHP?
Ще предаваме данни към шаблона като обект на клас, който дефинира всички променливи и техните типове. С използването на новите свойства на PHP 7.4, той може да изглежда така:
class MailTemplate
{
public string $lang = 'cs';
public Address $address;
public string $subject;
public ?float $price = null;
}
Използване:
$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);
Допълнение: благодарение на новите свойства на PHP 8, примерът може да бъде написан още по-интересно така:
class MailTemplate
{
public function __construct(
public string $lang = 'cs',
public Address $address,
public string $subject,
public ?float $price = null,
) {}
}
$latte->render('mail.latte', new MailTemplate(
lang: $this->lang,
subject: $title,
price: $this->getPrice(),
address: $userAddress,
));
Как да декларираме типове в шаблона?
Сега можем да свържем посочения клас с шаблона. Достатъчно е да посочим в началото:
{templateType MailTemplate}
И с това дефинирахме, че в шаблона ще има
четири променливи $lang
, $address
,
$subject
и $price
заедно със
съответните типове.
Алтернативата е да дефинираме типовете на
отделните променливи директно в шаблона,
т.е. без да създаваме клас. За това служи
тагът {varType}
:
{varType string $lang}
{varType Address $address}
Разбира се, може да се комбинира и двете.
Да се създаде клас, защото така осигуряваме
подсказване от страна на презентера, да го
свържем с шаблона с помощта на
{templateType}
и за останалите локални
променливи в блокове и т.н. да използваме
{varType}
. Което можем да разбираме като
аналог на /** @var type $variable */
, което е
коментар, с който понякога инструктираме IDE
или статичния анализатор в PHP кода.
Вече може да се посочи тип и в таговете
{var}
, {default}
или {define}
:
{var Model\Page $page = $items['page']}
{define form, string $name}
...
{/define}
Забележка: по исторически причини е било
възможно да се записват променливи в
таговете {var}
и {default}
без
водещия знак за долар. Тъй като това създава
двусмислие дали става въпрос за тип или за
променлива, този синтаксис е отпаднал и Latte
ще ви предупреждава, когато го
използвате.
Как да си спестим работа?
Как най-лесно да напишем клас на шаблон
или тагове {varType}
? Оставете ги да
бъдат генерирани. Точно затова съществуват
двойка тагове {templatePrint}
и
{varPrint}
.
Ако поставите някой от тези тагове в
шаблона, вместо обичайното изобразяване ще
се покаже предложение за код на клас, респ.
списък с тагове {varPrint}
. След това е
достатъчно с едно кликване да маркирате
кода и да го копирате в проекта.
Част от nette/application 3.1 (в бета версия) е
претоварен таг {templatePrint}
, който
генерира код, по-добре пригоден за
презентери.
Тагът {varPrint}
изписва локални
променливи, които не са параметри на
шаблона. Ако искате да изпишете всички
променливи, използвайте {varPrint all}
.
Подсказване в IDE
Най-новата версия на Latte плъгина за PhpStorm
може да използва горепосочените тагове и
след това да подсказва въз основа на
типовете. Плъгинът също така познава
типовете на стандартните променливи като
$user
, $presenter
, $basePath
и т.н.

Статичен анализ
Целта е всички декларирани типове да могат да се използват и за статичен анализ. Например, с помощта на PHPStan да могат да се проверяват шаблони толкова лесно, колкото и други PHP файлове.
Работим по това и ще го видите в някоя от следващите версии на Latte.
За да изпратите коментар, моля, влезте в системата