首页 > 解决方案 > 在 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) %}

标签: arraysvalidationtwig

解决方案


不,这是唯一的(香草)方式。如果你想让它更短,你需要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

推荐阅读