[英]Bug with “default” filter and boolean macro arguments in Twig / Symfony 2?
我正在使用default
Twig過濾器來指定我的宏中的參數默認值:
{% 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 %}
這不是一個bug。 你引用的文檔提到了它,雖然它遠非顯而易見:
如果值未定義或為空
我的重點。 False是一個空值。
Twig_Node_Expression_Default在代碼中創建Twig_Node_Expression_Conditional 。 最后,默認過濾器歸結為以下php代碼:
$passed_value ? $passed_value : $default_value
在您的情況下,傳遞的值為false,因此表達式返回默認值。
您應該繼續使用您的解決方法。
替換有問題的表達式my_boolean|default(true)
( my_boolean|default(false)
按預期工作),可以not my_boolean is defined or my_boolean
。
我遇到了同樣的“問題”,我確實喜歡這樣:
{% set dismissable = dismissable is not same as(false) %}
你可以使用null-coalescing運算符??
像這樣:
{% set dismissable = dismissable ?? true %}
這應該可以解決您的問題,這是一個很好的清潔解決方案。 :-)
編輯:它還解決了default(false)
問題。
這是@Maerlyn已經提到過的預期行為。
但是您可以利用fallback
過濾器並簡化代碼。
這將有效:
{% set dismissable = dismissable|fallback(true) %}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.