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.

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