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