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á.