Latte: как да работим с типовата система?

преди 5 години от David Grudl  

Типова система. Ключов въпрос за разработването на стабилни приложения, в който 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.

David Grudl Founder of Uměligence and creator of Nette Framework, the popular PHP framework. Since 2021, he's been fully immersed in artificial intelligence, teaching practical AI applications. He discusses weekly tech developments on Tech Guys with his co-hosts and writes for phpFashion and La Trine. He believes AI isn't science fiction—it's a practical tool for improving life today.

Последни публикации