web-dev-qa-db-fra.com

Message d'erreur Twig 2.0 "L'accès aux attributs Twig_Template est interdit"

Depuis la mise à niveau vers Twig 2.0, je reçois le message d'erreur Accessing Twig_Template attributes is forbidden. La ligne référencée contient soit un {{ include }}, soit un appel de macro.

13
Thomas Landauer

Dans Twig 2.0, les macros {{ import }} 'ed ne sont plus héritées des modèles enfants, voir https://github.com/twigphp/Twig/issues/2336

Solution: Vous devez importer la ou les macro (s) requise (s) dans chaque fichier .twig.

Si l'erreur apparaît sur une ligne contenant {{ include }} ou {{ extends }}, vous devez examiner le modèle en cours d'inclusion/extension et y importer la macro.

22
Thomas Landauer

Si de nombreux fichiers Twig utilisent vos macros, il pourrait être plus facile et moins sujet aux erreurs de de définir des fonctions globales de Twig à travers une extension Twig . De cette façon, vous n'avez pas besoin d'importer les macros dans chaque fichier (ce qui sera probablement corrigé dans une future version de Twig).

Par exemple, quand j'avais

{% macro error(message, dismissible=true) %}
   {# Error display code #}
{% endmacro %}

J'ai maintenant défini dans une extension Twig appelée UtilitiesExtensionthe Function suivante:

    public function getFunctions()
    {
        return array(
            // ...
            new \Twig_SimpleFunction('error', array($this, 'error')),
        );
    }

    public function error($message, $dismissible = true) {
        return $this->twig->render('patterns/utils/error.html.twig', [
            'text' => $message,
            'limit' => $dismissible,
        ]);
    }

Vous devez ensuite remplacer vos appels de macro par les noms de fonctions. notez que vous ne pouvez pas utiliser de points dans les noms de fonctions. 

Cette solution est propre car les macros Twig sont supposées être l’équivalent de PHP Functions. Bien sûr, cela devrait être adapté à vos besoins.

0
Gounzy