Symfony 中可选属性的验证

LBA*_*LBA 5 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 characters long",max=255, maxMessage="Name must not be longer than 255 characters")
 */
private $name;
Run Code Online (Sandbox Code Playgroud)

这将确保“名称”永远不会为空、空白或具有 <2 或 > 255 个字符。

但是,当假设有一个类似的字段(例如description)适用相同的规则但它是一个可选属性时,如何实现这一点?

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

我会寻找类似的东西:

/**
 * @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;
Run Code Online (Sandbox Code Playgroud)

所以 description 可以为空,但如果它不为空,则它不能为空,并且必须具有 > 2 或 < 255 个字符。

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

谢谢

Jar*_*ish 4

我认为你错过了第一个,第二个我认为减去不包括的部分@Assert/NotNull()就可以了。并且不会强制执行。Optional@Assert()@Assert/NotNull()NotBlank()Length(min)NotNull()

所以你会有这样的东西name

/**
 * @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;
Run Code Online (Sandbox Code Playgroud)

@Assert/NotNull()减去description

/**
 * @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;
Run Code Online (Sandbox Code Playgroud)