Latte: cum se utilizează sistemul de tipuri?

acum 5 ani De la David Grudl  

Sistemul de tipuri este principalul element pentru dezvoltarea de aplicații robuste. Tipurile din PHP au o superioritate față de alte limbaje dinamice, cum ar fi Python, Ruby sau JavaScript. Nette Framework îi determină pe programatori să producă cod tipizat și strict de la început. Latte 2.7 a adus suportul pentru tipuri și în cazul șabloanelor.

A ști ce tip de date sau de obiect este fiecare variabilă permite

  • IDE să completeze automat în mod corect
  • analiza statică pentru a detecta erorile

Două puncte care îmbunătățesc semnificativ calitatea și confortul dezvoltării.

Cum se declară tipurile în partea PHP?

Vom trece datele în șablon ca un obiect al unei clase care definește toate variabilele și tipurile acestora. Utilizând noile caracteristici ale PHP 7.4, ar putea arăta astfel:

class MailTemplate
{
	public string $lang = 'cs';
	public Address $address;
	public string $subject;
	public ?float $price = null;
}

Utilizare:

$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);

Adăugare: datorită noilor caracteristici ale PHP 8, exemplul poate fi scris mai interesant, astfel:

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,
));

Cum se declară tipurile într-un șablon?

Acum putem asocia clasa respectivă cu șablonul. Trebuie doar să o declarăm la început:

{templateType MailTemplate}

Astfel, am definit că șablonul va conține un cvartet de variabile $lang, $address, $subject și $price, inclusiv tipurile lor respective.

Alternativa este de a defini tipurile fiecărei variabile direct în șablon, adică fără a crea o clasă. În acest scop, se utilizează eticheta {varType}:

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

Bineînțeles, ambele pot fi combinate. Creați o clasă, deoarece acest lucru va asigura finalizarea pe partea prezentatorului, legați-o de șablon utilizând {templateType} și utilizați {varType} pentru alte variabile locale din blocuri etc. Acest lucru poate fi înțeles ca o analogie /** @var type $variable */, care este un comentariu pe care îl folosim uneori în codul PHP pentru a instrui IDE sau instrumentul de analiză statică.

De asemenea, tipul poate fi specificat în {var}, {default} sau {define}:

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

Notă: din motive istorice, a fost posibilă scrierea variabilelor în etichetele {var} și {default} fără semnul dolarului din față. Deoarece acest lucru creează ambiguitate dacă este vorba de un tip sau de o variabilă, această sintaxă este depreciată, iar Latte vă va avertiza atunci când o utilizați.

Cum vă simplificați munca?

Cum să scrieți o clasă șablon sau {varType} cât mai ușor posibil? Faceți-le să fie generate. Tocmai asta fac perechea de etichete {templatePrint} și {varPrint}.

Dacă plasați una dintre aceste etichete într-un șablon, codul clasei sau al șablonului este afișat în loc de redarea normală. Apoi, este suficient să selectați și să copiați codul în proiectul dumneavoastră.

Nette/application 3.1 (beta) include o etichetă supraîncărcată {templatePrint} care generează un cod mai potrivit pentru prezentatori.

Eticheta {varPrint} enumeră variabilele locale care nu sunt parametri de șablon. Dacă doriți să listați toate variabilele, utilizați {varPrint all}.

Completarea codului IDE

Cea mai recentă versiune a plugin-ului PhpStorm Latte poate profita de etichetele de mai sus și apoi poate sugera pe baza tipurilor. Plugin-ul cunoaște, de asemenea, tipurile de variabile standard, cum ar fi $user, $presenter, $basePath, etc.

Analiza statică

Scopul final este ca toate tipurile declarate să poată fi utilizate și pentru analiza statică. De exemplu, pentru a utiliza PHPStan pentru a verifica șabloanele la fel de ușor ca și alte fișiere PHP.

Lucrăm la acest lucru și îl veți vedea într-una dintre următoarele versiuni ale Latte.