Поддерживает ли TWIG переменные аргументы, используя маркер "..."? - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы предоставить переменное число аргументов функции из include, но я не уверен, поддерживает ли TWIG PHP трехточечный токен .

Я уверен, что могу сделать

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

в случае, если у меня есть Twig_Function, определенный в PHP с переменными аргументами

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?

1 Ответ

0 голосов
/ 02 июня 2018

Вы должны иметь возможность добавлять такие вариационные функции:

$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.

Примечание: Будьте предупрежденычто именованные аргументы, передаваемые в фильтр с переменными параметрами, не могут быть проверены на достоверность, поскольку они автоматически окажутся в массиве параметров.

Однако оператор ... (также известный как оператор сплата, оператор разброса илиоператор распространения) как таковой не поддерживается.

...