Latte: come gestire il sistema di tipi?

5 anni fa Da David Grudl  

Sistema di tipi. Una questione chiave per lo sviluppo di applicazioni robuste, in cui PHP ha guadagnato un grande vantaggio rispetto a linguaggi dinamici come Python, Ruby o JavaScript. Fin dall'inizio, il framework Nette ha guidato i programmatori verso una programmazione tipizzata e rigorosa. Latte 2.7 ha introdotto il supporto ai tipi anche nei template.

Grazie al fatto che sappiamo quale tipo di dato o oggetto è presente in ogni variabile, possiamo:

  • L'IDE può suggerire correttamente (autocompletamento)
  • L'analisi statica può rilevare errori

Due punti che aumentano significativamente la qualità e la comodità dello sviluppo.

Come dichiarare i tipi lato PHP?

Passeremo i dati al template come un oggetto di una classe che definisce tutte le variabili e i loro tipi. Utilizzando le nuove funzionalità di PHP 7.4, potrebbe assomigliare a questo:

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

Utilizzo:

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

Aggiunta: grazie alle nuove funzionalità di PHP 8, l'esempio può essere scritto in modo ancora più interessante:

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

Come dichiarare i tipi nel template?

Ora possiamo collegare la classe menzionata al template. Basta inserire all'inizio:

{templateType MailTemplate}

E con questo abbiamo definito che nel template ci saranno quattro variabili $lang, $address, $subject e $price inclusi i rispettivi tipi.

Un'alternativa è definire i tipi delle singole variabili direttamente nel template, cioè senza creare una classe. A questo scopo serve il tag {varType}:

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

Naturalmente, è possibile combinare entrambi. Creare una classe, perché questo garantisce l'autocompletamento lato presenter, collegarla al template usando {templateType} e per le altre variabili locali nei blocchi, ecc., usare {varType}. Che possiamo considerare come un analogo di /** @var type $variable */, che è un commento con cui a volte istruiamo l'IDE o l'analizzatore statico nel codice PHP.

Ora è possibile specificare il tipo anche nei tag {var}, {default} o {define}:

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

Nota: per motivi storici, nei tag {var} e {default} era possibile scrivere le variabili anche senza il dollaro iniziale (e con una freccia invece dell'uguale). Poiché questo crea ambiguità se si tratta di un tipo o di una variabile, questa sintassi è deprecata e Latte ti avviserà se la usi. Un modo semplice per cercare nei tuoi template se hai questa vecchia sintassi è cercare le espressioni regolari /\{(var|default) [^$]/ e /\{(var|default) [^}]*=>/.

Come risparmiare lavoro?

Qual è il modo più semplice per scrivere una classe di template o i tag {varType}? Falli generare. Proprio per questo esistono i due tag {templatePrint} e {varPrint}.

Se inserisci uno di questi tag in un template, invece del rendering normale, verrà visualizzata una bozza del codice della classe o un elenco di tag {varPrint}. Quindi basta selezionare il codice con un clic e copiarlo nel progetto.

Parte di nette/application 3.1 (in versione beta) è un tag {templatePrint} sovraccaricato che genera codice più adatto ai presenter.

Il tag {varPrint} elenca le variabili locali che non sono parametri del template. Se vuoi elencare tutte le variabili, usa {varPrint all}.

Autocompletamento nell'IDE

L'ultima versione del plugin Latte per PhpStorm può utilizzare i tag sopra menzionati e quindi fornire suggerimenti basati sui tipi. Il plugin conosce anche i tipi delle variabili standard come $user, $presenter, $basePath, ecc.

Analisi statica

L'obiettivo è che tutti i tipi dichiarati possano essere utilizzati anche per l'analisi statica. Ad esempio, che con PHPStan sia possibile controllare i template con la stessa facilità degli altri file PHP.

Stiamo lavorando su questo e lo vedrai in una delle prossime versioni di Latte.

David Grudl An artificial intelligence and web technology specialist, creator of the Nette Framework and other popular open-source projects. He writes for Uměligence, phpFashion, and La Trine blogs. He conducts AI training workshops and hosts the Tech Guys show. He's passionate about making artificial intelligence accessible through clear, practical explanations. Creative and pragmatic, he has a keen eye for real-world technology applications.