簡體   English   中英

如何在symfony2驗證器中允許空值

[英]How to allow empty values in symfony2 validators

我想僅在值不為空時才對對象屬性應用驗證器,即。

現在標准的symfony行為:

class Entity
{
    /**
     * @ORM\Column(type="string", nullable=true)
     * @Assert\Email()
     */
    protected $email;
    (...)
}

如果電子郵件為空,或者為空字符串,那么該對象不會通過驗證,是否有辦法告訴驗證者斷言為有效的空值,並僅在字段有數據時驗證?

PS我知道我可以編寫回調驗證器,但為每個字段寫回調只是為了擁有“allowEmpty”功能並不是那么好。

您必須在FormBuilder類中為所有可選字段顯式設置'required' => false 這是一段描述字段類型選項的段落。


編輯。 獲得了不少投票。 默認情況下, NotNullNotEmpty 所有驗證器都將null值視為有效。 這兩個問題都沒有用在問題中。 問題隱含於如何關閉默認情況下打開的客戶端required屬性。

設置required選項不是解決方案:

另請注意,將required選項設置為true將不會導致應用服務器端驗證。 換句話說,如果用戶為該字段提交空白值(例如,使用舊瀏覽器或Web服務),則除非您使用Symfony的NotBlank或NotNull驗證約束,否則它將被接受為有效值。

http://symfony.com/doc/current/book/forms.html#field-type-options

對於我的自定義驗證器,我添加了一個

if (null == $value) {
    return true;
}

isValid()方法。 但是,我不確定標准驗證器類的最佳方法是什么。

如果我理解正確,只有輸入值才需要服務器端驗證。 我正是在同一個場景中。 我想僅在提供URL時才驗證URL。 我遇到的最好方法是編寫自己的自定義驗證類。 您可以編寫通用的自定義驗證類。

我按照這個鏈接https://symfony-docs-chs.readthedocs.org/en/2.0/cookbook/validation/custom_constraint.html除了因為symfony的最新版本而進行的一些更改。 這是實施

ACME \\ BundleNameBundle \\驗證\\約束\\ cstmUrl

namespace Acme\BundleNameBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;

/**
 * @Annotation
 */
class CstmUrl extends Url
{
    public $message = 'The URL "%string%" is not valid';
}

ACME \\ BundleNameBundle \\驗證\\約束\\ cstmUrlValidator

namespace Acme\BundleNameBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraints\UrlValidator;

class CstmUrlValidator extends UrlValidator
{
    public function validate($value, Constraint $constraint)
    {
        if(!$value || empty($value))
            return true;

        parent::validate($value, $constraint);
    }
}

Validtion.yml

Acme\BundleNameBundle\Entity\Student:
    Url:
        - Acme\BundleNameBundle\Validator\Constraints\CstmUrl: ~

在Controller內部綁定你通常會做的約束

'constraints'=> new CstmUrl(array("message"=>"Invalid url provided"))

我相信可以有其他更好的方法來做到這一點,但是現在我覺得這樣做很好。

以防萬一其他人遇到同樣的問題。 我更喜歡通過在我的Twig模板中添加以下屬性來親自解決它:

{{ form_row(form.<field>, {'required': false}) }}

這是我發現的技巧:

https://github.com/symfony/symfony/issues/5906

您需要編寫一個不執行任何操作的數據轉換器,然后將其添加到您的字段中。 之后,juste將第二個參數的submit()方法調用為false。

請注意,Symfony 2.3沒問題。

字段類型猜測處理這個。 http://symfony.com/doc/current/book/forms.html#field-type-guessing

這取決於你的表單聲明 :“當你省略add()方法的第二個參數時(或者如果你向它傳遞null),激活”猜測“。如果你傳遞一個options數組作為第三個參數(為dueDate完成)如上所述),這些選項適用於猜測字段。“

暫無
暫無

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

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