24

小枝テンプレート内のオブジェクトの値にアクセスしたい。

通常、私はそのようなリターンを取得します:

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

しかし、小枝を使用してテンプレートで同じことを行うにはどうすればよいですか?

私は非常に多くの方法を試しましたが、誰もうまくいきませんでした。

たとえば、私は試しました:

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

結果とともに

キャッチ可能な致命的なエラー: Twig_Node_Expression_GetAttr::__construct() に渡される引数 3 は、Twig_Node_Expression_Array のインスタンスである必要があります。指定された Twig_Node_Expression_Constant のインスタンスです。

ありがとう

4

2 に答える 2

47

あなたがやろうとしているのは、Twig テンプレートのパラメーターを使用してオブジェクトのメソッドを呼び出すことです。おそらく悪い考えと見なされているため、これはサポートされていないと思います。ただし、Twig は、パラメーターなしで呼び出されるオブジェクトの getter の概念をサポートしています。

{{ lang.test }}

次のいずれかをこの順序で呼び出そうとします。

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

オブジェクトがこれらのアクセサーと規則のいずれかを実装している場合、Twig はそれを見つけます。のように、この規則の外側にあるものget('test')は、Twig の哲学の一部ではありません。また、一般的に広く使用されているイディオムではないため、上記の方法のいずれかに固執する必要があります。

http://twig.sensiolabs.org/doc/templates.html#variablesを参照してください。

またはマジック メソッドを実装して__isset、これらのアクセサ メソッドのいずれかをサポートできます。__get__call

于 2013-01-19T11:01:41.217 に答える
9

これは古い質問であることは知っていますが、3時間インターネットを精査して例を見つけられなかったので、文書化されていることを確認したかった.

元の試行の 1 つに戻ります。

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

私は同じことをしようとしていますが、これはドキュメントに従って動作するはずです。残念ながら、これを使用した例はありません。私が見つけたのは、メソッド名 (get) が文字列 ('get') でなければならないということだけだったので、それを変更しましたが、それでも機能しませんでした。私がやったことはこれでした:

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

これはうまく機能しましたが、これをすべてやり直さなければならない場合、記述するコードは非常に多くなります。そこで、両方の方法で単純なテンプレートを作成し、コンパイルされた出力を調べました。オリジナルはこれにコンパイルされました:

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

そしてこれへの2番目(2ライナー):

$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);

調べてみると、違いがわかりました (getAttribute の 3 番目のパラメーターを確認してください)、arguments パラメーターは配列です。これは知っておくとよい情報です。オリジナルを次のように変更しました。

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

そしてそれは今働いています!

これが誰かを助けることを願っています!

于 2016-11-18T19:17:35.997 に答える