Php Symfony中可选属性的验证

Php Symfony中可选属性的验证,php,symfony,Php,Symfony,我喜欢将Symfony中的验证注释用于我的大型实体模型,如下所示: /** * @var string * @ORM\Column(type="string", length=255, nullable=false, name="name") * * @Assert\NotBlank(message="Name must not be empty") * @Assert\Length(min=2, minMessage="Name must be at least 2 characte

我喜欢将Symfony中的验证注释用于我的大型实体模型,如下所示:

/**
 * @var string
 * @ORM\Column(type="string", length=255, nullable=false, name="name")
 *
 * @Assert\NotBlank(message="Name must not be empty")
 * @Assert\Length(min=2, minMessage="Name must be at least 2 characters long",max=255, maxMessage="Name must not be longer than 255 characters")
 */
private $name;
这将确保“name”从不为null、空或255个字符

但是,如果有一个类似于字段的描述,同样的规则适用于它,但它是一个可选属性,那么如何实现这一点呢

我知道我可以编写回调函数,具有自定义约束等等。。。但这将迫使我为所有现有的验证器(NotBlank、Length、Number、Valid a.s.o)创建自己的逻辑

我会寻找类似的东西,比如:

/**
 * @var string
 * @ORM\Column(type="string", length=255, nullable=true, name="description")
 *
 * @OptionalAssert\NotBlank(message="Name must not be empty")
 * @OptionalAssert\Length(min=2, minMessage="Name must be at least 2 characters long",max=255, maxMessage="Name must not be longer than 255 characters")
 */
private $description;
因此,描述可以为null,但如果它不是null,则它不能为空,并且必须具有>2个或<255个字符

我曾想过为此创建一个自定义约束-但我能够以某种方式将标准验证器和这些参数交给我的自定义验证器,以避免重新创建\NotBlank\Length等,而只是重用标准验证器


谢谢

我想你在第一个问题上遗漏了
@Assert/NotNull()
,我认为第二个问题可以减去
@Assert()
可选部分,因为
@Assert/NotNull()
不包括在内
NotBlank()
并且不会强制执行
NotNull()

因此,对于
名称
,您将有类似的内容:

/**
 * @var string
 * @ORM\Column(type="string", length=255, nullable=false, name="name")
 *
 * @Assert\NotNull(message="Name must not be empty")
 * @Assert\NotBlank(message="Name must not be empty")
 * @Assert\Length(min=2, minMessage="Name must be at least 2 characters long",max=255, maxMessage="Name must not be longer than 255 characters")
 */
private $name;
并减去
说明的
@Assert/NotNull()

/**
 * @var string
 * @ORM\Column(type="string", length=255, nullable=true, name="description")
 * 
 * @Assert\NotBlank(message="Name must not be empty")
 * @Assert\Length(min=2, minMessage="Name must be at least 2 characters long",max=255, maxMessage="Name must not be longer than 255 characters")
 */
private $description;

这对我来说是完全好的,但扩展每个标准约束和标准验证器、将其注册为服务等会让我非常痛苦。。。我正在寻找一种简单的方法来添加一些“if($value==null){return true;}else{continue with standard}”逻辑。我认为第一个方法中缺少了
@Assert/NotNull()
,第二个方法我认为可以减去
@Assert()
可选部分,因为
@Assert/NotNull()
不包括在内
NotBlank()
并且不会强制执行
NotNull()
@JaredFarrish非常感谢!我试了很长时间,效果如预期。因此,我必须尝试每个标准验证器的工作方式,我只需要为那些涉及空检查的验证器创建一个自定义验证器。如果你提供答案,我可以把它标为绿色;-)帮助提示是“长度不会强制NotNull()