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

gre*_*emo 5 symfony twig

我正在使用defaultTwig过滤器在我的宏中指定参数默认值:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

问题是,dismissable参数类型应该是boolean.但是,在传递false过滤器时会对其进行求true值并指定默认值.一个示例输出:

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

boolean false
boolean true
Run Code Online (Sandbox Code Playgroud)

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

如果值未定义或为空,则默认过滤器返回传递的默认值,否则返回变量的值.

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

{% set dismissable = dismissable is not defined or dismissable is null ?
    true : dismissable %}
Run Code Online (Sandbox Code Playgroud)

Mae*_*lyn 14

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

如果值未定义或为

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

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

$passed_value ? $passed_value : $default_value
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

您可以像这样使用空合并运算符??

{% set dismissable = dismissable ?? true %}
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您的问题,并且这是一个很好且干净的解决方案。:-)

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