如何在symfony2验证器中允许空值

can*_*nni 26 php validation symfony

我想仅在值不为空时才对对象属性应用验证器,即.

现在标准的symfony行为:

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

如果电子邮件为null或空字符串,那么该对象不会通过验证,是否有办法告诉验证者断言为有效的空值,并仅在字段有数据时验证?

PS我知道我可以编写回调验证器,但为每个字段写回调只是为了拥有"allowEmpty"功能并不是那么好.

gil*_*den 25

您必须'required' => falseFormBuilder类中明确设置所有可选字段.这是一段描述字段类型选项的段落.


编辑.获得了不少投票.默认情况下,除了之外,所有验证器都将null值视为有效.这两个问题都没有用在问题中.问题隐含在如何关闭默认打开的客户端属性. NotNullNotEmptyrequired

  • 这不是正确的答案.'required'选项仅强制执行客户端验证. (29认同)
  • @TyrionLannister你确实是对的.但是,除非具有`NotNull()`和`NotEmpty()`约束,否则没有任何默认验证器导致空值被视为无效.看到提问者既没有这些限制,也暗示问题出在客户端HTML5"required"属性上. (7认同)
  • @gilden充满应有的尊重,`required`属性与批准的空值没有共同之处.它仅用于HTML5客户端验证,并且与验证(服务器端验证)无关. (3认同)
  • @AndrzejOśmiałowski绝对,请查看你上面的评论.这正是我说的:) (2认同)

小智 20

设置required选项不是解决方案:

另请注意,将required选项设置为true将不会导致应用服务器端验证.换句话说,如果用户为该字段提交空白值(例如,使用旧浏览器或Web服务),则除非您使用Symfony的NotBlank或NotNull验证约束,否则它将被接受为有效值.

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

对于我的自定义验证器,我添加了一个

if (null == $value) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

isValid()方法.但是,我不确定标准验证器类的最佳方法是什么.