在Twig中,我将数组params
传递给宏。在宏中,我检查是否设置了required_element
的所有必需元素(此处为params
)。如果没有,我想将其设置为默认值。
此代码有效,但我认为必须有更好的方法:
{% macro my_macro(params) %}
{% if not params.required_element is defined %}
{% set params = params|merge({'required_element: 'value'}) %}
{% endif %}
我想到的是像{% params.required_element ?: value %}
这样较短的东西,但这没用。
出于各种原因,我不希望将它们作为宏的参数一个接一个地传递,所以这是不的一种替代选择:
{% macro my_macro(required_element, another_element, yet_another, puh_another, next_element) %}
答案 0 :(得分:0)
不,那是唯一的方法。如果要缩短它的长度,则需要使用以下内容扩展twig
:
<?php
$twig = new \Twig\Environment($loader);
$function = new \Twig\TwigFunction('set_array_value', function (&$context, $array_name, $index, $value) {
if (!isset($context[$array_name])) return;
/**
- If value is array just do arr[index] = value
- Otherwise test if object
-> test if method $index exists
-> test if there is a setter for the property $index
**/
if (is_array($context[$array_name])) $context[$array_name][$index] = $value;
elseif(is_object($context[$array_name])) {
if (method_exists($context[$array_name], $index)) $context[$array_name]->{$index}($value);
elseif(method_exists($context[$array_name], 'set'.$index)) $context[$array_name]->{'set'.$index}($value);
}
}, ['needs_context' => true, ]);
$twig->addFunction($function);
{% macro foo(my_array) %}
{% if not array.foo is defined %}{% do set_array_value('my_array', 'foo', 'bar') %}{% endif %}
{{ my_array.foo }}
{% endmacro %}
{% import _self as sandbox %}
{{ sandbox.foo({}) }} #output: bar
{{ sandbox.foo({'foo': 42,}) }} #output: 42