Latte: hogyan kezeljük a típusrendszert?

5 éve írta David Grudl  

Típusrendszer. Kulcsfontosságú elem a robusztus alkalmazások fejlesztésében, amelyben a PHP nagy előnyre tett szert az olyan dinamikus nyelvekkel szemben, mint a Python, a Ruby vagy a JavaScript. A Nette keretrendszer kezdettől fogva a típusos és szigorú programozás felé vezeti a programozókat. A Latte 2.7 a sablonokban is bevezette a típusok támogatását.

Annak köszönhetően, hogy tudjuk, milyen adat- vagy objektumtípus van minden változóban,

  • az IDE helyesen tud súgni
  • a statikus analízis felfedheti a hibákat

Két pont, amely alapvetően növeli a fejlesztés minőségét és kényelmét.

Hogyan deklaráljunk típusokat a PHP oldalon?

Az adatokat egy osztály objektumaként adjuk át a sablonnak, amely meghatározza az összes változót és azok típusát. A PHP 7.4 új tulajdonságait kihasználva ez így nézhet ki:

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

Használat:

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

Kiegészítés: a PHP 8 új tulajdonságainak köszönhetően a példa még érdekesebben írható így:

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

Hogyan deklaráljunk típusokat a sablonban?

Az említett osztályt most összekapcsolhatjuk a sablonnal. Elég az elejére írni:

{templateType MailTemplate}

És ezzel definiáltuk, hogy a sablonban a $lang, $address, $subject és $price változók a megfelelő típusokkal együtt lesznek jelen.

Alternatív megoldásként az egyes változók típusait közvetlenül a sablonban definiálhatjuk, azaz osztály létrehozása nélkül. Erre szolgál a {varType} tag:

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

Természetesen mindkettőt kombinálhatjuk. Létrehozunk egy osztályt, mert ezzel biztosítjuk a súgást a presenter oldalon, összekapcsoljuk a sablonnal a {templateType} segítségével, és a többi lokális változóhoz a blokkokban stb. a {varType}-ot használjuk. Ezt a /** @var type $variable */ megfelelőjének tekinthetjük, ami egy komment, amellyel néha a PHP kódban utasítjuk az IDE-t vagy a statikus elemzőt.

Újonnan a típust a {var}, {default} vagy {define} tagekben is megadhatjuk:

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

Megjegyzés: történelmi okokból a {var} és {default} tagekben a változókat kezdő dollárjel nélkül is lehetett írni (és nyíllal egyenlőségjel helyett). Mivel ez kétértelműséget okoz abban, hogy típusról vagy változóról van-e szó, ez a szintaxis tiltott, és a Latte figyelmeztetni fog a használatakor. Egyszerű módja annak, hogy átnézze a sablonjait, hogy van-e bennük ez a régi írásmód, ha a /\{(var|default) [^$]/ és /\{(var|default) [^}]*=>/ reguláris kifejezésekre keres.

Hogyan spóroljunk munkát?

Hogyan írjuk meg a legegyszerűbben a sablon osztályát vagy a {varType} tageket? Generáltassuk ki őket. Pontosan erre szolgál a {templatePrint} és {varPrint} tagek párja.

Ha ezen tagek valamelyikét elhelyezi a sablonban, a szokásos renderelés helyett az osztály kódjavaslata, illetve a {varPrint} tagek listája jelenik meg. Ezután elég egy kattintással kijelölni a kódot és bemásolni a projektbe.

A nette/application 3.1 (béta verzió) része egy túlterhelt {templatePrint} tag, amely jobban a presenterekhez igazított kódot generál.

A {varPrint} tag a lokális változókat írja ki, amelyek nem sablonparaméterek. Ha az összes változót ki akarja íratni, használja a {varPrint all}-t.

Súgó az IDE-ben

A Latte plugin legújabb verziója a PhpStormhoz képes kihasználni a fent említett tageket, és ezután a típusok alapján súgni. A plugin egyúttal ismeri a standard változók típusait, mint például a $user, $presenter, $basePath stb.

Statikus analízis

A cél az, hogy az összes deklarált típust statikus analízishez is lehessen használni. Hogy például a PHPStan segítségével a sablonokat ugyanolyan könnyen lehessen ellenőrizni, mint más PHP fájlokat.

Ezen dolgozunk, és a Latte valamelyik következő verziójában számíthat rá.

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.