簡體   English   中英

在Twig / Symfony 2中使用“默認”過濾器和布爾宏參數的錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM