Twig 访问对象

问题描述 投票:0回答:2

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

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

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

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

我尝试了很多方法,但没有一个有效。

例如我尝试过:

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

结果

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

谢谢

php twig
2个回答
50
投票

您想要做的是使用 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
魔术方法来支持这些访问器方法之一。


9
投票

回到你最初的尝试之一:

{{ 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']) }}

现在可以使用了!

© www.soinside.com 2019 - 2024. All rights reserved.