PHP n'est pas un bon langage de template
Par Laurentj le jeudi, octobre 8 2009, 12:39 - Technologies Web - Lien permanent
Ça me fait plaisir de lire ce genre de billet, surtout venant de la part d'une figure du monde PHP, à savoir Fabien Potencier (monsieur Symfony). Ça fait des années que je pense comme Fabien : PHP est un mauvais langage de template. Pas assez sécure (que fait-t-on des templates uploadés par des utilisateurs par exemple ?), trop verbeux, parfois trop complexe pour les intégrateurs web qui ne savent pas programmer, et n'impose pas une séparation entre logique métier et "vue" (vu que dans un template en PHP, on peut appeler tout et n'importe quoi).
C'est pourquoi j'ai toujours préfèré utiliser un langage qui soit conçu pour les templates, pour faciliter leurs écritures d'une part, et de bien faire une séparation entre la logique métier et la "vue". Et c'est pourquoi dans Jelix, j'ai crée mon propre moteur de template, ultra léger et performant, jTpl, qui est disponible en version standalone, dont je devrais sortir la version 1.0 dés que j'ai un peu de temps.
Commentaires
Tu as raison Laurent, ca craint PHP ! ;)
Je confirme jTpl est rapide, léger et puissant. En fait il contient 90% de Twig en 2 fichiers.
Juste le sandboxing en moins, mais en regardant le code de Twig, il faudrait ajouter 50 lignes de code maximum pour avoir la même chose.
jTpl c'est du bon !
je ne trouve pas la gestion de l'héritage des templates dans jTpl, un oubli de la doc peut être ?
Le titre de ton article est un véritable appel au troll. Saymal. Heureusement, je suis totalement im-mu-ni-sé contre ce genre de choses. 0:-)
Va falloir que je compulse l’artice de Fabien Potencier et que je teste jTpl pour voir quels sont les templates qui passent dans KompoZer sans foirer…
Apres une visite rapide de la doc jTpl ressemble très fortement a Smarty comme beaucoup d'autres frameworks de templates (Twig ... etc). On y retrouve toujours l'utilisation de code coté template. Je ne vois pas trop en quoi c'est une révolution sinon dans la taille et le nombre de fichiers.
Sinon totalement ok avec le fait que php + templates c'est pas trop ca pour un integrateur.
"dont je devrais sortir la version 1.0 dés que j'ai un peu de temps."
Tiens on se croirait presque sur le site de Copix ;-)
crazyball : http://twitter.com/ljouanneau/statu...
@loic : il y a une sandbox dans jTpl. On ne peut pas executer n'importe quoi, et on a encore plus de restriction quand le mode secure est activé.
@romain: non, pas d'heritage dans jtpl, même si on peut en faire de manière détourné (voir la doc de la version standalone)
@kaze : ouai, vive les troll \o/ :-) bon sinon, les templates de jtpl sont comme celles de smarty ou autre, il y a des chances que ça passe mal quand par ex dans le template on a des instructions entre des tr, ou à d'autres endroit inattendu. On a un peu le même problème que les templates pur php.
@crasyball: oui, jtpl ressemble beaucoup à smarty dans son utilisation, c'est voulu, parce que j'aime bien le principe de smarty (d'ailleurs quelques plugins sont issues de smarty, moyennant une légère adaptation). la veritable plus value de jtpl est dans sa légerté (1), la syntaxe utilisée proche de php mais avec des simplifications (pas besoin d'apprendre un enième langage), et sa performance (pour "compiler" le template, on utilise le tokenizer PHP).
(1)
Et tout ça pour un set de feature à peu près équivalent.
Je suis entièrement d'accord, mais ayant pas mal donné avec asp.net, je pense qu'il est difficile de parvenir à quelque chose de parfait, aussi... c'est souvent des développeurs qui se tapent l'intégration. Et PHP n'est pas si mal au fond.
Par contre, désolé pour le troll mais comparer 2 systèmes de template en comptant les lignes de code me parait peu pertinent : une analyse de leur complexité (O(n)) serait sans doute plus apte nous orienter :)
Je me fais l'avocat du diable pour smarty vu que je n'ai jamais pratiqué jtpl :))
@stephane : certes, compter le nombre de ligne de code ne fait pas tout. Mais il ne faut pas oublier que PHP doit charger à chaque requete http tout les scripts necessaires à l'execution. la taille du code est donc une donnée à prendre en compte. Concretement, même avec un cache d'opcode, charger jelix va être plus rapide que smarty.
Pour répondre plus à ton interrogation, jtpl est ultrasimple, en O(n), voir O(1) lorsque le template est compilé, car dans cette forme, le template se résume à une fonction faisant de l'output, donc concrétement, jtpl fait juste un include et un appel de cette fonction. (je ne compte pas la complexité du template en lui même...)
Bonjour, et XSL n'est-il pas pertinent pour gérer des templates ?
@nico : peut être quand XSLT ne demandera pas 3 ans d'études de ses specs ? Quand ce langage sera abordable par la majorité des développeurs. (et je ne parle pas des intégrateurs web...)
Et puis, non, XSLT n'est pas un langage de template, mais de transformation.
... J'ai jamais eu de soucis a ce niveau. J'ai utilise different langages de templates pour finalement revenir au php.
Deux raison:
- les fonctionnalites disponibles
- la rapidite
Je ne comprends pas pourquoi on devrait rajouter une analyse de texte (qui prend du temps) pour juste afficher une page ...
Un simple <?php echo $var ?> est rapide. Maintenant oui j'utilise une classe de template pour securiser mes variables. Jamais eu plus de soucis, ma classe fait une centaine de ligne et fonctionne parfaitement depuis plus de 5 ans...
Ca sert a rien de reinventer la roue :)
>Je ne comprends pas pourquoi on devrait rajouter une analyse de texte (qui prend du temps)
ça ne prend du temps que dans les moteurs de templates pourris. Les bon moteurs de tempate converti le template en fichier php, et le met en cache. donc, le temps d'execution n'est pas plus long que d'utiliser un simple fichier php.
>Un simple <?php echo $var ?> est rapide
Sauf que, la plupart du temps, il faut echapper le contenu de $var avec htmlspecialchars, histoire d'avoir du html valide en sortie, ou éviter d'avoir des problèmes de secu. <?php echo htmlspecialchars($var);?>, ça commence à être vraiment long à écrire. Alors que les moteurs de template peuvent te le faire automatiquement, rien qu'en écrivant par exemple {$var}. :-p