Latte : comment utiliser le système de type ?

il y a 4 ans de David Grudl  

Le système de types est un élément essentiel pour le développement d'applications robustes. Les types en PHP ont une supériorité sur les autres langages dynamiques tels que Python, Ruby ou JavaScript. Le cadre Nette amène les programmeurs à produire un code typé et strict dès le début. Latte 2.7 a apporté le support des types aux templates également.

Connaître le type de données ou d'objet de chaque variable permet à l'IDE d'autocompléter correctement le code.

  • à l'IDE d'autocompléter correctement
  • l'analyse statique pour détecter les erreurs

Deux points qui améliorent considérablement la qualité et la commodité du développement.

Comment déclarer les types du côté de PHP ?

Nous allons passer les données au modèle comme un objet d'une classe qui définit toutes les variables et leurs types. En utilisant les nouvelles fonctionnalités de PHP 7.4, cela pourrait ressembler à ceci :

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

Utilisation :

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

Ajout : grâce aux nouvelles fonctionnalités de PHP 8, l'exemple peut être écrit de façon plus intéressante comme ceci :

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

Comment déclarer des types dans un template ?

Nous pouvons maintenant associer cette classe au modèle. Nous devons simplement le déclarer au début :

{templateType MailTemplate}

Et avec cela, nous avons défini que le modèle contiendra un quatuor de variables $lang, $address, $subject et $price y compris leurs types respectifs.

L'alternative est de définir les types de chaque variable directement dans le modèle, c'est-à-dire sans créer de classe. Le tag {varType} est utilisé à cet effet :

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

Bien entendu, les deux solutions peuvent être combinées. Créez une classe, car cela garantira l'achèvement du côté du présentateur, liez-la au modèle à l'aide de {templateType} et utilisez {varType} pour les autres variables locales dans les blocs, etc. Ceci peut être compris comme une analogie /** @var type $variable */, qui est un commentaire que nous utilisons parfois dans le code PHP pour donner des instructions à l'IDE ou à l'outil d'analyse statique.

De même, le type peut être spécifié dans {var}, {default} ou {define}:

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

Remarque : pour des raisons historiques, il était possible d'écrire des variables dans les balises {var} et {default} sans le signe dollar en tête. Comme cela crée une ambiguïté quant à savoir s'il s'agit d'un type ou d'une variable, cette syntaxe est dépréciée et Latte vous avertira si vous l'utilisez.

Comment simplifiez-vous votre travail ?

Comment écrire une classe modèle ou {varType} le plus simplement possible ? En les faisant générer. C'est précisément ce que fait la paire de balises {templatePrint} et {varPrint}.

Si vous placez l'une de ces balises dans un modèle, le code de la classe ou du modèle s'affiche au lieu du rendu normal. Il suffit ensuite de sélectionner et de copier le code dans votre projet.

Nette/application 3.1 (bêta) comprend une balise surchargée {templatePrint} qui génère un code mieux adapté aux présentateurs.

La balise {varPrint} liste les variables locales qui ne sont pas des paramètres de modèle. Si vous voulez lister toutes les variables, utilisez {varPrint all}.

Complément de code IDE

La dernière version du plugin PhpStorm Latte peut tirer parti des balises ci-dessus et faire des suggestions en fonction des types. Le plugin connaît également les types des variables standard telles que $user, $presenter, $basePath, etc.

Analyse statique

L'objectif final est que tous les types déclarés puissent également être utilisés pour l'analyse statique. Par exemple, pour utiliser PHPStan afin de vérifier les templates aussi facilement que les autres fichiers PHP.

Nous travaillons sur ce point et vous le verrez dans l'une des prochaines versions de Latte.