J'ai un projet sur Symfony 2.1. Après avoir mis à jour composer composants (Gedemo, Symfony core, Doctrine, Twig, etc.), j'ai l'erreur suivante:
Fatal error: Maximum function nesting level of '100' reached, aborting! in /var/www/{path}/vendor/twig/twig/lib/Twig/Token.php on line 78
J'ai PHP 5.4. Qu'est-ce qui peut provoquer cette erreur?
Trouvez le xdebug.ini
fichier:
$ locate xdebug.ini
/etc/php5/conf.d/20-xdebug.ini
/etc/php5/mods-available/xdebug.ini
Dans mon cas, le fichier est /etc/php5/conf.d/20-xdebug.ini
. Ouvrez-le et ajoutez cette ligne:
xdebug.max_nesting_level = 1000
N'oubliez pas de redémarrer le serveur FPM.
c'est un code d'erreur qui provoque une boucle infinie, mais il arrive de temps en temps que le traitement sans erreur dépasse les 100 appels de fonctions imbriquées.
Pour corriger cela, ouvrez la section php.ini, xdebug et ajoutez la ligne suivante (en mettant ce que vous voulez au lieu de 150)
[xdebug]
xdebug.max_nesting_level = 150
Je partage juste quelques petits conseils aux nouveaux développeurs Twig qui pourraient être intéressés de comprendre la partie "Qu'est-ce qui cause .." de la question.
De toute évidence, dans la question d'origine, le niveau d'imbrication maximum est plutôt bas (100) et, comme certains commentaires le mentionnent, il pourrait être trop bas dans des circonstances normales.
Cependant, si l'on augmente le niveau à, disons 256, 512 ou même 1000 comme indiqué ci-dessus et que l'on rencontre toujours la même erreur, alors la chose la plus potentielle à regarder serait alors l'héritage du modèle . (Les mots clés extends
sur la première ligne des modèles)
C'est particulièrement le cas avec les projets où vous avez des modèles à plusieurs endroits.
Imaginez un exemple de structure de projet:
── plugins
├── your-plugin
| ├── views
| │ ├── base.twig
│ │ ├── special-element.twig
│ │ ├── some-other-element.twig
── theme
├── base.twig
├── index.twig
├── sub-page.twig
Le plugin a un modèle base.twig
qui étend le base.twig
sous le thème . Mais si les emplacements des modèles ne sont pas correctement configurés, les modèles peuvent finir par s'étendre encore et encore, provoquant la boucle infinie.
Comment vérifier si c'est le cas? Je serais heureux d'entendre parler de solutions plus précises, mais on peut commencer - à des fins de débogage uniquement - aussi simple que de se référer aux modèles parents avec les chemins d'accès complets au serveur:
{% extends "/var/www/path-to-your-template/" %}
S'il commence à fonctionner avec des chemins absolus, alors vous pouvez être sûr qu'il y a un problème avec les chemins du modèle. En savoir plus à ce sujet ici: Noms et emplacements des modèles de brindilles
si augmentation xdebug.max_nesting_level = 1000
l'échec de la vérification de l'espace de noms est correct
par exemple: namespace App\Entities;
mais nom du dossier en minuscules app
alors l'entité doit contenir un espace de noms comme namespace app\Entities;