我正在使用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 %}
答案 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) %}