我想访问树枝模板内的对象的值。
通常我会得到这样的回报:
echo $lang->get("test");
但是我怎样才能在模板中用 twig 做同样的事情呢?
我尝试了很多方法,但没有一个有效。
例如我尝试过:
{{ attribute(lang, get, 'test') }}
结果
可捕获的致命错误:参数 3 传递给 Twig_Node_Expression_GetAttr::__construct() 必须是一个实例 Twig_Node_Expression_Array,Twig_Node_Expression_Constant 的实例 给定
谢谢
您想要做的是使用 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
魔术方法来支持这些访问器方法之一。
回到你最初的尝试之一:
{{ 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);
经过检查,我意识到了区别(检查getAttribute的第三个参数),arguments参数是一个数组!这是值得了解的好信息。我把原来的改成了这样:
{{ attribute(lang, 'get', ['test']) }}
现在可以使用了!