Twig访问对象

use*_*080 17 php twig

我想访问树枝模板内的对象的值.

通常我会得到这样的回报:

echo $lang->get("test");
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能在模板中用树枝做同样的事情呢?

我尝试了很多方法,但没有人工作.

例如我试过:

{{ attribute(lang, get, 'test') }} 
Run Code Online (Sandbox Code Playgroud)

结果

可捕获致命错误:传递给Twig_Node_Expression_GetAttr :: __ construct()的参数3必须是Twig_Node_Expression_Array的实例,给出Twig_Node_Expression_Constant的实例

谢谢

dec*_*eze 40

您要做的是在Twig模板中使用参数调用对象上的方法.我不认为这是支持的,因为它可能被视为一个坏主意.虽然Twig支持对象上的getter概念,但它们不带参数调用:

{{ lang.test }}
Run Code Online (Sandbox Code Playgroud)

将尝试按以下顺序调用以下之一:

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

如果对象实现了这些访问器和约定中的任何一个,Twig就会找到它.除了这个惯例之外的任何东西get('test')都不是Twig哲学的一部分.并且它一般不是广泛使用的习语,所以你应该坚持使用上述方法之一.

请参见http://twig.sensiolabs.org/doc/templates.html#variables.

您可以实现__isset,__get或者__call魔术方法,以支持这些访问方法之一.

  • 我想`属性(lang,'get','test')`应该这样做(注意`get`周围的引号).从来没有用过这个. (2认同)

小智 6

我知道这是一个老问题,但经过3个小时的互联网搜索并没有找到任何例子,我想确保它有记录.

回到原来的尝试之一:

{{ attribute(lang, get, 'test') }}
Run Code Online (Sandbox Code Playgroud)

我正在尝试做同样的事情,这应该根据文档工作.不幸的是,没有使用它的例子.我发现的只是方法名称(get)必须是一个字符串('get'),所以我改变了它,但它仍然没有用.我最终做的是这样的:

{% set myText = lang.get('test') %}
{{ myText }}
Run Code Online (Sandbox Code Playgroud)

这很好用,但是当我必须全部执行此操作时,需要编写大量代码.所以我用两种方法制作了一个简单的模板,并检查了编译输出.原文编译为:

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

和第二个(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);
Run Code Online (Sandbox Code Playgroud)

经过检查,我意识到了差异(检查第三个参数到getAttribute),参数参数是一个数组!这是很好的信息.我把原来改成了这个:

{{ attribute(lang, 'get', ['test']) }}
Run Code Online (Sandbox Code Playgroud)

它现在正在工作!

希望这有助于某人!