Latte: cum să abordăm sistemul de tipuri?

acum 5 ani de David Grudl  

Sistemul de tipuri. O problemă cheie pentru dezvoltarea aplicațiilor robuste, în care PHP a câștigat un avantaj semnificativ față de limbajele dinamice precum Python, Ruby sau JavaScript. Framework-ul Nette i-a ghidat pe programatori către programarea tipizată și strictă încă de la început. Latte 2.7 a adus suport pentru tipuri și în șabloane.

Datorită faptului că știm ce tip de date sau obiect se află în fiecare variabilă, putem:

  • IDE-ul să ofere sugestii corecte
  • analiza statică să detecteze erori

Două puncte care cresc fundamental calitatea și confortul dezvoltării.

Cum să declarăm tipurile în partea PHP?

Vom transmite datele către șablon ca un obiect al unei clase care definește toate variabilele și tipurile lor. Folosind 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);

Completare: datorită noilor caracteristici ale PHP 8, exemplul poate fi scris și 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 să declarăm tipurile în șablon?

Acum putem conecta clasa menționată cu șablonul. Este suficient să specificăm la început:

{templateType MailTemplate}

Și astfel am definit că în șablon vor exista patru variabile $lang, $address, $subject și $price inclusiv tipurile corespunzătoare.

O alternativă este definirea tipurilor variabilelor individuale direct în șablon, adică fără a crea o clasă. Pentru aceasta se folosește tag-ul {varType}:

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

Desigur, ambele pot fi combinate. Creați o clasă, deoarece astfel asigurăm sugestii în partea presenterului, o conectăm la șablon folosind {templateType} și pentru alte variabile locale în blocuri etc. folosim {varType}. Pe care le putem considera echivalente cu /** @var type $variable */, care este un comentariu prin care uneori instruim IDE-ul sau analizatorul static în codul PHP.

Acum tipul poate fi specificat și în tag-urile {var}, {default} sau {define}:

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

Notă: din motive istorice, în tag-urile {var} și {default} era posibil să se scrie variabile și fără dolarul inițial (și cu săgeată în loc de egal). Deoarece acest lucru creează ambiguitate dacă este vorba de un tip sau de o variabilă, această sintaxă este interzisă și Latte vă va avertiza la utilizarea ei. O modalitate simplă de a căuta în șabloanele dvs. dacă aveți această veche notație este să căutați expresiile regulate /\{(var|default) [^$]/ și /\{(var|default) [^}]*=>/.

Cum să economisim muncă?

Cum să scriem cel mai ușor clasa șablonului sau tag-urile {varType}? Lăsați-le să fie generate. Tocmai pentru asta există perechea de tag-uri {templatePrint} și {varPrint}.

Dacă plasați unul dintre aceste tag-uri într-un șablon, în loc de randarea normală, se va afișa o propunere de cod pentru clasă, respectiv o listă de tag-uri {varPrint}. Apoi este suficient să selectați codul cu un singur clic și să-l copiați în proiect.

Parte din nette/application 3.1 (în versiune beta) este tag-ul supraîncărcat {templatePrint}, care generează cod mai bine adaptat pentru presenteri.

Tag-ul {varPrint} listează variabilele locale care nu sunt parametri ai șablonului. Dacă doriți să listați toate variabilele, utilizați {varPrint all}.

Sugestii în IDE

Cea mai recentă versiune a pluginului Latte pentru PhpStorm poate utiliza tag-urile menționate mai sus și apoi să ofere sugestii pe baza tipurilor. Pluginul cunoaște, de asemenea, tipurile variabilelor standard, cum ar fi $user, $presenter, $basePath etc.

Analiză statică

Scopul este ca toate tipurile declarate să poată fi utilizate și pentru analiza statică. De exemplu, folosind PHPStan, să fie posibilă verificarea șabloanelor la fel de ușor ca și alte fișiere PHP.

Lucrăm la asta și veți vedea în una dintre versiunile viitoare ale Latte.