在Twig中:检查数组元素是否存在。如果未设置此元素

时间:2019-07-11 09:16:56

标签: arrays validation twig

在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) %}

1 个答案:

答案 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