我想访问树枝模板中对象的值。
通常我会得到这样的回报:
echo $lang->get("test");
但是我怎么能在模板中用树枝做同样的事呢?
我尝试了很多方法但没人工作。
例如我试过:
{{ attribute(lang, get, 'test') }}
结果
可捕获的致命错误:参数3传递给 Twig_Node_Expression_GetAttr :: __ construct()必须是。的实例 Twig_Node_Expression_Array,Twig_Node_Expression_Constant的实例 给定
感谢
答案 0 :(得分:39)
您要做的是使用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
魔术方法来支持其中一种访问方法。
答案 1 :(得分:6)
我知道这是一个老问题,但经过3个小时的互联网搜索并找不到任何例子,我想确保记录下来。
回到原来的一次尝试:
{{ attribute(lang, get, 'test') }}
我试图做同样的事情,这应该按照documentation工作。不幸的是,没有使用它的例子。我发现的只是方法名称(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个班轮)到此:
$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),参数参数是一个数组!这是很好的信息。我把原来改成了这个:
{{ attribute(lang, 'get', ['test']) }}
它现在正在工作!
希望这有助于某人!