簡體   English   中英

如何在 Symfony 約束組件中使用 normalizer 選項

[英]How to use normalizer option in Symfony constraints component

文檔https://symfony.com/doc/4.4/reference/constraints/Length.html#normalizer指出

此選項允許在檢查是否有效之前定義應用於給定值的 PHP 可調用對象。

例如,您可能希望傳遞 'trim' 字符串以應用修剪 PHP 函數,以便在驗證期間忽略前導和尾隨空格。**

我能夠像示例中一樣調用trim,甚至可以調用類的靜態函數:

class PersonDto
{
    /**
     * @Assert\Length(min="1", max="255", allowEmptyString=false, normalizer="App\Dto\PersonDto::foo")
     */
    private ?string $name = null;

    public static function foo($value) {
        $value = 'the text has been replaced';
        return $value;
    }

    ...
}

但由於某種原因,返回的值不會改變該值。 我做錯了什么,或者如何將回調函數寫入“normalizer”選項

Symfony 驗證器不會更改您傳遞給它進行驗證的值,它只是檢查它們是否符合您指定的約束。 因此,在您的情況下,它會在檢查長度時使用修剪以確保它有效,但會保留 DTO 屬性供您處理。

我假設使用 fosrestbundle 標記,您一直在使用請求正文轉換器偵聽器將直接傳遞給 DTO 的數據轉換?

當我需要類似的東西時,我所做的是使用 Symfony Serializer 從請求數據中生成我的 DTO 和它自己的非規范化器,這使得它期望的字段通過並通過修剪准備數據,如果它是一個字符串等,然后手動將其傳遞給驗證器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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