Latte : qu'en est-il du système de types ?

il y a 5 ans par David Grudl  

Le système de types. Un élément clé pour le développement d'applications robustes, dans lequel PHP a pris une avance considérable sur les langages dynamiques tels que Python, Ruby ou JavaScript. Dès le début, le framework Nette a guidé les programmeurs vers une programmation typée et stricte. Latte 2.7 a apporté la prise en charge des types également dans les templates.

Grâce au fait que nous savons quel type de données ou d'objet se trouve dans chaque variable,

  • l'IDE peut correctement suggérer
  • l'analyse statique peut détecter les erreurs

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

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

Nous transmettrons les données au template sous forme d'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);

Complément : grâce aux nouvelles fonctionnalités de PHP 8, l'exemple peut être écrit de manière encore 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 les types dans le template ?

Nous pouvons maintenant lier la classe mentionnée au template. Il suffit d'indiquer au début :

{templateType MailTemplate}

Et nous avons ainsi défini que dans le template, il y aura quatre variables $lang, $address, $subject et $price avec leurs types respectifs.

Une alternative consiste à définir les types des variables individuelles directement dans le template, c'est-à-dire sans créer de classe. La balise {varType} est utilisée à cet effet :

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

Bien sûr, les deux peuvent être combinés. Créez une classe, car cela garantit l'autocomplétion côté presenter, liez-la au template à l'aide de {templateType}, et pour les autres variables locales dans les blocs, etc., utilisez {varType}. Que nous pouvons considérer comme l'équivalent de /** @var type $variable */, qui est un commentaire que nous utilisons parfois dans le code PHP pour instruire l'IDE ou l'analyseur statique.

Désormais, le type peut également être indiqué dans les balises {var}, {default} ou {define} :

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

Note : pour des raisons historiques, il était possible dans les balises {var} et {default} d'écrire des variables sans le dollar initial (et avec une flèche au lieu d'un signe égal). Comme cela crée une ambiguïté quant à savoir s'il s'agit d'un type ou d'une variable, cette syntaxe est obsolète et Latte vous avertira si vous l'utilisez. Un moyen simple de rechercher dans vos templates si vous avez cette ancienne syntaxe est de rechercher les expressions régulières /\{(var|default) [^$]/ et /\{(var|default) [^}]*=>/.

Comment économiser du travail ?

Quelle est la manière la plus simple d'écrire une classe de template ou des balises {varType} ? Faites-les générer. C'est précisément à cela que servent les deux balises {templatePrint} et {varPrint}.

Si vous placez l'une de ces balises dans un template, au lieu du rendu normal, une proposition de code de classe ou une liste de balises {varPrint} sera affichée. Il suffit ensuite de sélectionner le code d'un simple clic et de le copier dans votre projet.

nette/application 3.1 (en version bêta) inclut une balise {templatePrint} surchargée qui génère un code mieux adapté aux presenters.

La balise {varPrint} affiche les variables locales qui ne sont pas des paramètres du template. Si vous souhaitez afficher toutes les variables, utilisez {varPrint all}.

Autocomplétion dans l'IDE

La dernière version du plugin Latte pour PhpStorm peut utiliser les balises mentionnées ci-dessus et ensuite suggérer en fonction des types. Le plugin connaît également les types des variables standard telles que $user, $presenter, $basePath, etc.

Analyse statique

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

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