Symfony 中可选属性的验证

问题描述 投票:0回答:2

我喜欢将 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 等。全部由我自己完成,而只是重用标准验证器?

谢谢

php symfony
2个回答
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;

减去

@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;

0
投票

在 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),
                        ])
                     
                ]
            ),

© www.soinside.com 2019 - 2024. All rights reserved.