Latte: kako do tipskega sistema?

pred 5 leti od David Grudl  

Tipski sistem. Ključna zadeva za razvoj robustnih aplikacij, pri kateri je PHP pridobil veliko prednost pred dinamičnimi jeziki, kot so Python, Ruby ali JavaScript. Ogrodje Nette že od začetka programerje vodi k tipskemu in strogemu programiranju. Latte 2.7 je prinesel podporo tipom tudi v predloge.

Zahvaljujoč temu, da vemo, kateri podatkovni ali objektni tip je v vsaki spremenljivki, lahko

  • IDE pravilno predlaga
  • statična analiza odkrije napake

Dve točki, ki bistveno povečujeta kakovost in udobje razvoja.

Kako deklarirati tipe na strani PHP?

Podatke bomo predlogi posredovali kot objekt razreda, ki definira vse spremenljivke in njihove tipe. Z uporabo novih lastnosti PHP 7.4 bi lahko izgledal takole:

class MailTemplate
{
	public string $lang = 'cs';
	public Address $address;
	public string $subject;
	public ?float $price = null;
}

Uporaba:

$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);

Dopolnitev: zahvaljujoč novim lastnostim PHP 8 lahko primer zapišemo še bolj zanimivo takole:

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,
));

Kako deklarirati tipe v predlogi?

Navedeni razred lahko zdaj povežemo s predlogo. Dovolj je, da na začetku navedemo:

{templateType MailTemplate}

In s tem smo definirali, da bodo v predlogi štiri spremenljivke $lang, $address, $subject in $price vključno z ustreznimi tipi.

Alternativa je definiranje tipov posameznih spremenljivk neposredno v predlogi, tj. brez ustvarjanja razreda. Za to služi značka {varType}:

{varType string $lang}
{varType Address $address}

Seveda lahko oboje kombiniramo. Ustvarimo razred, ker s tem zagotovimo predlaganje na strani presenterja, ga povežemo s predlogo s pomočjo {templateType} in za ostale lokalne spremenljivke v blokih ipd. uporabljamo {varType}. Kar lahko razumemo kot analogijo /** @var type $variable */, kar je komentar, s katerim včasih v PHP kodi usmerjamo IDE ali statični analizator.

Po novem lahko tip navedemo tudi v značkah {var}, {default} ali {define}:

{var Model\Page $page = $items['page']}
{define form, string $name}
	...
{/define}

Opomba: iz zgodovinskih razlogov je bilo mogoče v značkah {var} in {default} pisati spremenljivke tudi brez začetnega znaka dolarja (in s puščico namesto enačaja). Ker to ustvarja dvoumnost, ali gre za tip ali spremenljivko, je ta sintaksa prepovedana in Latte vas bo ob njeni uporabi opozoril. Preprost način, kako preiskati svoje predloge, ali imate tam ta stari zapis, je iskanje regularnih izrazov /\{(var|default) [^$]/ in /\{(var|default) [^}]*=>/.

Kako si prihraniti delo?

Kako najlažje napisati razred predloge ali značke {varType}? Naj se vam generirajo. Prav za to obstaja par značk {templatePrint} in {varPrint}.

Če katero od teh značk postavite v predlogo, se namesto običajnega izrisa prikaže predlog kode razreda oz. seznam značk {varPrint}. Kodo nato z enim klikom označite in kopirate v projekt.

Del nette/application 3.1 (v beta različici) je preobremenjena značka {templatePrint}, ki generira kodo, bolje prilagojeno za presenterje.

Značka {varPrint} izpisuje lokalne spremenljivke, ki niso parametri predloge. Če želite izpisati vse spremenljivke, uporabite {varPrint all}.

Predlaganje v IDE

Najnovejša različica Latte vtičnika za PhpStorm zna izkoristiti zgoraj navedene značke in nato predlagati na podlagi tipov. Vtičnik hkrati pozna tipe standardnih spremenljivk, kot so na primer $user, $presenter, $basePath itd.

Statična analiza

Cilj je, da bi se dali vsi deklarirani tipi uporabiti tudi za statično analizo. Da bi bilo na primer s pomočjo PHPStan mogoče preverjati predloge enako enostavno kot druge PHP datoteke.

Na tem delamo in dočakali boste v kateri od prihodnjih različic Latte.