树枝访问对象

2022-08-30 17:34:05

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

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

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

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

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

例如,我尝试过:

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

与结果

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

谢谢


答案 1

您尝试执行的操作是在 Twig 模板中使用参数在对象上调用方法。我不认为这是受支持的,因为它可能被视为一个坏主意。Twig支持对象上的getters的概念,这些概念在没有参数的情况下调用:

{{ lang.test }}

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

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

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

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

您可以实现 或魔术方法来支持这些访问器方法之一。__isset__get__call


答案 2

我知道这是一个老问题,但是在搜索互联网3个小时并且没有找到任何例子之后,我想确保它被记录下来。

回到您最初的尝试之一:

{{ 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衬里)到这个:

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

经过检查,我意识到了差异(检查第3个参数以获取属性),参数参数是一个数组!这是一个很好的信息。我将原来的样子改成了这个:

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

它现在正在工作!

希望这有助于某人!


推荐