Latte: kako uporabljati sistem tipov?

pred 4 leti od David Grudl  

Sistem tipov je glavna stvar pri razvoju robustnih aplikacij. Tipi v PHP imajo prednost pred drugimi dinamičnimi jeziki, kot so Python, Ruby ali JavaScript. Okvir Nette programerje že od samega začetka vodi k ustvarjanju tipizirane in stroge kode. Latte 2.7 je prinesel podporo za tipe tudi v predloge.

Vedeti, kateri podatkovni ali objektni tip je posamezna spremenljivka, omogoča

  • IDE pravilno samodejno dopolnjevanje
  • statično analizo za odkrivanje napak

Dve točki, ki bistveno izboljšata kakovost in udobje razvoja.

Kako deklarirati vrste na strani PHP?

Podatke bomo predlogi posredovali kot objekt razreda, ki definira vse spremenljivke in njihove tipe. Z uporabo novih funkcij PHP 7.4 bi bilo to lahko videti 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);

Zaradi novih funkcij PHP 8 lahko primer zapišemo bolj zanimivo, kot je ta:

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?

Ta razred lahko zdaj povežemo s predlogo. Navesti ga moramo le na začetku:

{templateType MailTemplate}

S tem smo določili, da bo predloga vsebovala četverico spremenljivk $lang, $address, $subject in $price, vključno z njihovimi vrstami.

Druga možnost je, da tipe vsake spremenljivke določimo neposredno v predlogi, torej brez ustvarjanja razreda. V ta namen se uporablja oznaka {varType}:

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

Seveda je mogoče oboje kombinirati. Ustvarite razred, saj boste s tem zagotovili dokončanje na strani predstavitve, ga povežite s predlogo z uporabo {templateType} in uporabite {varType} za druge lokalne spremenljivke v blokih itd. To lahko razumemo kot analogijo /** @var type $variable */, kar je komentar, ki ga včasih uporabljamo v kodi PHP, da bi naročili IDE ali orodje za statično analizo.

Prav tako lahko tip določimo v {var}, {default} ali {define}:

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

Opomba: iz zgodovinskih razlogov je bilo mogoče spremenljivke v oznakah {var} in {default} zapisati brez začetnega znaka dolarja. Ker to ustvarja dvoumnost, ali gre za tip ali spremenljivko, je ta sintaksa zastarela in Latte vas bo opozoril, če jo boste uporabili.

Kako poenostavite svoje delo?

Kako čim lažje napisati razred predloge ali {varType}? Pridobite jih generirane. Prav to stori par oznak {templatePrint} in {varPrint}.

Če v predlogo namestite eno od teh oznak, se namesto običajnega prikazovanja prikaže koda razreda ali predloge. Nato preprosto izberite in kopirajte kodo v svoj projekt.

Nette/aplikacija 3.1 (beta) vključuje preobremenjeno oznako {templatePrint}, ki generira kodo, ki je primernejša za predstavnike.

Oznaka {varPrint} navaja lokalne spremenljivke, ki niso parametri predloge. Če želite našteti vse spremenljivke, uporabite {varPrint all}.

Dopolnjevanje kode IDE

Najnovejša različica vtičnika PhpStorm Latte lahko izkoristi zgornje oznake in nato predlaga na podlagi vrst. Vtičnik pozna tudi vrste standardnih spremenljivk, kot so $user, $presenter, $basePath itd.

Statična analiza

Končni cilj je, da se lahko vse prijavljene vrste uporabljajo tudi za statično analizo. Na primer, da se PHPStan uporabi za preverjanje predlog enako preprosto kot drugih datotek PHP.

Na tem delamo in to boste videli v eni od naslednjih različic programa Latte.