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