7

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

{% 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

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

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

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

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

5 回答 5

16

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

如果值未定义或为

由我强调。False 是一个空值。

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

$passed_value ? $passed_value : $default_value

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

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

于 2012-05-29T07:27:15.623 回答
5

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

{% set dismissable = dismissable ?? true %}

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

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

于 2016-06-06T07:11:45.327 回答
3

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

于 2015-09-12T13:47:25.143 回答
1

我遇到了同样的“问题”,我这样做了:

{% set dismissable = dismissable is not same as(false) %}
于 2014-12-07T01:22:31.460 回答
0

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

于 2018-03-16T13:10:39.903 回答