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.