在Twig / Symfony 2中使用“默认”过滤器和布尔宏参数的错误?

时间:2012-05-28 22:30:36

标签: symfony twig

我正在使用default Twig过滤器来指定macro中的参数默认值:

{% macro base(type, title, content, separator, dismissable) %}
{% spaceless %}

    {% debug dismissable %}

    {% set separator   = separator|default('!') %}
    {% set dismissable = dismissable|default(true) %}

    {% debug dismissable %}

    {# Beginning outputting... #}
{% endspaceless %}
{% endmacro %}

问题dismissable参数类型应为boolean。但是,当传递false时,过滤器会对其进行评估并指定true默认值。 示例输出

{{ base('success', 'Title', 'Hello', '!', false) }}

boolean false
boolean true

这是一个错误吗?这是(部分)过滤器描述:

  

如果值为,则默认过滤器返回传递的默认值   undefined或empty,否则为变量的值。

甚至没有提到布尔false的评估。我的临时解决方法是:

{% set dismissable = dismissable is not defined or dismissable is null ?
    true : dismissable %}

5 个答案:

答案 0 :(得分:13)

这不是一个错误。你引用的文档提到了它,虽然它远非显而易见:

  

如果值未定义或为空

我的重点。 False是一个空值。

Twig_Node_Expression_Default在代码中创建Twig_Node_Expression_Conditional。最后,默认过滤器归结为以下php代码:

$passed_value ? $passed_value : $default_value

在您的情况下,传递的值为false,因此表达式返回默认值。

您应该继续使用您的解决方法。

答案 1 :(得分:3)

替换有问题的表达式my_boolean|default(true)my_boolean|default(false)按预期工作),可以是not my_boolean is defined or my_boolean

答案 2 :(得分:1)

我遇到了同样的问题"我确实喜欢这个:

{% set dismissable = dismissable is not same as(false) %}

答案 3 :(得分:1)

您可以像这样使用null-coalescing运算符??

{% set dismissable = dismissable ?? true %}

这应该可以解决您的问题,这是一个很好的清洁解决方案。 : - )

编辑:它还解决了default(false)问题。

答案 4 :(得分:0)

这是@Maerlyn已经提到过的预期行为 但是您可以利用fallback过滤器并简化您的代码 这将起作用:
    {% set dismissable = dismissable|fallback(true) %}