Latte: come gestire il sistema di tipi?
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.
	
			
			
			
Per inviare un commento, effettuare il login