TWIG 是否支持使用“...”标记的可变参数?

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

我想从

include
为函数提供可变数量的参数,但我不确定 TWIG 是否支持 PHP 三点标记

我一定可以

{{ callFunction('funcName', arg1, arg2, arg3) }}
{{ callFunction('funcName2', null, true) }}

如果我在 PHP 中使用可变参数定义了

Twig_Function

public function callFunction($name, ...$arguments)

但是如果我想通过

include
调用该函数怎么办?

{% set foo = 'bar' %}
{% include 'call_function.twig' with {
    'func_name':'funcName2',
    'arguments': [ null, true ]
%}

这个好像不支持

{{ callFunction(func_name, ...arguments) }}

如何将可变数量的参数传递给

include

php include twig variadic-functions
2个回答
4
投票

您应该能够添加这样的可变参数函数:

$twigenv->addFunction(new Twig_SimpleFunction('foo', function ($a1, array $args = array()) {
}, array('is_variadic' => true));

用途:

{{ foo(1, 2, a="a", b="b") }}
#{# foo(1, array(0 => 2, "a" => "a", "b" => "b")); #}

您还可以创建可变过滤器

当过滤器应该接受任意数量的参数时,设置 is_variadic 选项设置为 true; Twig 将传递额外的参数作为 过滤器调用的最后一个参数作为数组:

$filter = new Twig_Filter('foo', function ($file, array $options = array()) {
    // ...
}, array('is_variadic' => true));

然后,将过滤器添加到您的 Twig 环境中:

$twig = new Twig_Environment($loader);
$twig->addFilter($filter);

然后,在模板中使用它:

{{ value|foo(options) }}

如果这还不够,您可以创建自己的 Tiwg 扩展。

注意: 请注意,传递给可变参数过滤器的命名参数不能 检查有效性,因为它们会自动出现在选项中 数组。

但是,不支持

...
运算符(也称为 splat 运算符、分散运算符或展开运算符)。


0
投票

twig 3.0 现在支持扩展运算符。

https://twig.symfony.com/doc/3.x/templates.html#other-operators

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