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