我喜欢将 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”永远不会为空、空白或有 <2 or > 255 个字符。
但是,当我们假设有一个类似的字段(如 description )应用相同的规则但它是可选属性时,如何实现这一点?
我知道我可以编写回调函数,具有自定义约束等等...但这将迫使我为所有现有验证器(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;
因此描述可以为空,但如果它不为空,则它不能为空,并且必须大于 2 或 < 255 chars.
我想为此创建一个自定义约束 - 但我能够以某种方式将标准验证器和参数交给我的自定义验证器,以避免重新创建 \NotBlank \Length 等。全部由我自己完成,而只是重用标准验证器?
谢谢
我认为第一个缺少
@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;
减去
@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;
在 Symfony 5.4 中你可以做
new Assert\AtLeastOneOf(
[
//rule #1 making it optional field
new Assert\IsNull(),
// rule #2(can be composite) actually checking if it is a good value
new Assert\Sequentially([
new Assert\Regex('/^[0-9]+$/i'),
new Assert\GreaterThan(0),
])
]
),