Latte: hogyan kell használni a típusrendszert?

4 éve A címről David Grudl  

A típusrendszer a robusztus alkalmazások fejlesztésének legfontosabb eszköze. A PHP-ben a típusok fölényben vannak más dinamikus nyelvekkel, például a Python, a Ruby vagy a JavaScript nyelvekkel szemben. A Nette keretrendszer arra készteti a programozókat, hogy kezdettől fogva tipizált és szigorú kódot készítsenek. A Latte 2.7 a sablonokba is bevitte a típustámogatást.

Annak ismerete, hogy az egyes változók milyen adat- vagy objektumtípusúak, lehetővé teszi, hogy

  • az IDE-nek, hogy helyesen automatikusan kitöltse
  • statikus elemzés a hibák felderítéséhez

Két olyan pont, amely jelentősen javítja a fejlesztés minőségét és kényelmét.

Hogyan kell típusokat deklarálni a PHP oldalán?

Az adatokat egy olyan osztály objektumaként adjuk át a sablonhoz, amely minden változót és azok típusát definiálja. A PHP 7.4 új funkcióit haszná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 funkcióinak köszönhetően a példa érdekesebbé tehető:

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 kell típusokat deklarálni egy sablonban?

Most már társíthatjuk ezt az osztályt a sablonhoz. Ezt csak az elején kell megadnunk:

{templateType MailTemplate}

És ezzel meghatároztuk, hogy a sablon tartalmazni fog egy kvartett változót: $lang, $address, $subject és $price, beleértve a hozzájuk tartozó típusokat is.

Az alternatíva az, hogy az egyes változók típusait közvetlenül a sablonban határozzuk meg, azaz osztály létrehozása nélkül. Erre a célra a {varType} címkét használjuk:

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

Természetesen mindkettő kombinálható. Hozzon létre egy osztályt, mivel ez biztosítja a teljességet a bemutató oldalán, kösse a sablonhoz a {templateType} segítségével, és használja a {varType} -t a blokkok egyéb helyi változóihoz stb. Ez a /** @var type $variable */ analógiájaként értelmezhető, ami egy olyan megjegyzés, amelyet néha használunk a PHP kódban, hogy utasítsuk az IDE-t vagy a statikus elemző eszközt.

A típus is megadható a {var}, {default} vagy {define}:

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

Megjegyzés: történelmi okokból a {var} és a {default} címkékben a változókat a vezető dollárjel nélkül is lehetett írni. Mivel ez félreérthetővé teszi, hogy típusról vagy változóról van-e szó, ez a szintaxis elavult, és a Latte figyelmeztetni fog, ha használja.

Hogyan egyszerűsíti a munkáját?

Hogyan írjunk sablon osztályt vagy {varType} a lehető legegyszerűbben? Generáltassa őket. Pontosan erre szolgál a {templatePrint} és a {varPrint} címkepár.

Ha a sablonban elhelyezzük az egyik ilyen taget, akkor a normál megjelenítés helyett az osztály vagy a sablon kódja jelenik meg. Ezután egyszerűen válassza ki és másolja be a kódot a projektjébe.

A Nette/application 3.1 (béta) tartalmaz egy túlterhelt {templatePrint} címkét, amely a prezentálók számára jobban használható kódot generál.

A {varPrint} tag olyan helyi változókat sorol fel, amelyek nem sablonparaméterek. Ha az összes változót fel akarja sorolni, használja a {varPrint all}.

IDE kódkiegészítés

A PhpStorm Latte plugin legújabb verziója képes kihasználni a fenti címkéket, majd típusok alapján javaslatot tenni. A plugin ismeri a szabványos változók típusait is, mint például $user, $presenter, $basePath, stb.

Statikus elemzés

A végső cél az, hogy minden deklarált típus statikus elemzésre is használható legyen. Például, hogy a PHPStan segítségével a sablonokat ugyanolyan egyszerűen ellenőrizhessük, mint más PHP fájlokat.

Ezen dolgozunk, és a Latte egyik következő verziójában látni fogod.