Latte: hogyan kezeljük a típusrendszert?
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á.
A hozzászólás elküldéséhez kérjük, jelentkezzen be