web-dev-qa-db-fra.com

Twig objet d'accès

je veux accéder à la valeur d'un objet à l'intérieur d'un modèle twig.

Normalement, j'obtiendrais le retour comme ça:

echo $lang->get("test");

Mais comment puis-je faire de même dans le modèle avec twig?

J'ai essayé tellement de méthodes mais personne n'a travaillé.

Par exemple, j'ai essayé:

{{ attribute(lang, get, 'test') }} 

avec le résultat

Erreur irrécupérable: l'argument 3 transmis à Twig_Node_Expression_GetAttr :: __ construct () doit être une instance de Twig_Node_Expression_Array, une instance de Twig_Node_Expression_Constant étant donnée

merci

19
user1766080

Ce que vous essayez de faire est d'appeler une méthode sur un objet avec des paramètres dans un modèle Twig. Je ne pense pas que cela soit pris en charge, car il est probablement considéré comme une mauvaise idée. Twig supporte cependant la notion de getters sur un objet, qui sont appelés sans paramètres:

{{ lang.test }}

essaiera d'invoquer l'un des éléments suivants, dans cet ordre:

  • $lang->test
  • $lang->test()
  • $lang->getTest()
  • $lang->isTest()

Si l'objet implémente l'un de ces accesseurs et conventions, Twig le trouvera. Tout ce qui est en dehors de cette convention, comme get('test'), ne fait pas partie de Twig philosophie. Et ce n'est pas un idiome largement utilisé en général, donc vous devriez probablement vous en tenir à l'une des méthodes ci-dessus.

Voir http://twig.sensiolabs.org/doc/templates.html#variables .

Vous pouvez implémenter les méthodes magiques __isset, __get Ou __call Pour prendre en charge l'une de ces méthodes d'accesseur.

39
deceze

Je sais que c'est une vieille question, mais après 3 heures à parcourir Internet et à ne trouver aucun exemple, je voulais m'assurer qu'elle était documentée.

Revenons à l'une de vos tentatives initiales:

{{ attribute(lang, get, 'test') }}

J'essaie de faire la même chose, et cela devrait fonctionner selon la documentation . Malheureusement, il n'y a aucun exemple d'utilisation de cela. Tout ce que j'ai trouvé, c'est que le nom de la méthode (get) devait être une chaîne ('get'), j'ai donc changé cela, mais cela ne fonctionnait toujours pas. J'ai fini par faire ceci:

{% set myText = lang.get('test') %}
{{ myText }}

Cela a très bien fonctionné, mais c'est beaucoup de code à écrire quand je dois le faire partout. J'ai donc créé un modèle simple avec les deux méthodes et examiné la sortie compilée. L'original a été compilé comme suit:

echo twig_escape_filter($this->env, $this->getAttribute((isset($context["lang"]) ? $context["lang"] : null), "get", "test"), "html", null, true);

et le deuxième (2 lignes) à ceci:

$context["myText"] = $this->getAttribute((isset($context["lang"]) ? $context["lang"] : null), "get", array(0 => "test"), "method");
echo twig_escape_filter($this->env, (isset($context["myText"]) ? $context["myText"] : null), "html", null, true);

Après examen, j'ai réalisé la différence (vérifiez les 3èmes paramètres pour obtenirAttribut), le paramètre arguments est un tableau! Ce sont de bonnes informations à savoir. J'ai changé mon original en ceci:

{{ attribute(lang, 'get', ['test']) }}

et ça marche maintenant!

J'espère que cela aide quelqu'un!

6
Daniel Israel