Symfony 嵌套约束无法正常工作

Symfony nested constraints don't work properly

提问人:Danylo Koniushenko 提问时间:1/16/2023 更新时间:1/16/2023 访问量:308

问:

我在 Symfony 验证中遇到了一个奇怪的问题。 似乎“嵌套”约束无法正常工作。

例如,我创建了一个需要验证$data字符串变量。

$data = 'string';
$constraint = new Assert\Type('integer');
$violations = $validator->validate($data, $constraint);
self::assertTrue($violations->count() > 0);

在这种情况下,它可以正常工作。我们将字符串变量传递给只允许整数的约束。但是,如果我创建“嵌套”约束,测试将无法通过。

$data = 'string';
$constraint = new Assert\Required([
    new Assert\Type('integer'),
]);
$violations = $validator->validate($data, $constraint);
self::assertTrue($violations->count() > 0);

在这种情况下,测试失败。验证者未发现任何违规行为。

是错误吗?还是我做错了什么?

PHP Symfony 验证 约束

评论

1赞 Jonathan 1/16/2023
有约束吗?你想在这里实现什么?这对我来说毫无意义,在“类型”周围有一个“必需”。我的意思是,每个约束都是“必需的”,并且有一个整数隐含一个非空值Assert\Required
1赞 Jonathan 1/16/2023
根据文档,您可以使用验证属性对约束进行分组/嵌套
0赞 Danylo Koniushenko 1/16/2023
谢谢你的回答,@Jonathan。实际上我不需要必需的约束,只是想为一个值设置多个约束。我看到一个示例,他们使用 Required 或 Optional 对多个约束进行分组。现在我可以从您的文档链接中看到,我可以只使用带有约束的数组。所以这是我错误地使用了约束。
0赞 Jonathan 1/16/2023
很高兴它有帮助。我将来会添加它作为其他人的答案。

答:

1赞 Adrien G 1/16/2023 #1

如果您希望您的数据不为空(必填)并且是一个数字:

$data = 'string';

$validator = Validation::createValidator();
$violations = $validator->validate($data, [
    new NotBlank(),
    new Type(['integer'),
]);

查看 https://symfony.com/doc/current/components/validator.html

1赞 Jonathan 1/16/2023 #2

没有约束。Assert\Required

从 Symfony 5.4 开始,您可以使用 Attributes 来组合约束:

#[Assert\All([
    new Assert\NotNull(),
    new Assert\Range(min: 3),
])]

#[Assert\Collection(
    fields: [
        'foo' => [
            new Assert\NotNull(),
            new Assert\Range(min: 3),
        ],
        'bar' => new Assert\Range(min: 5),
        'baz' => new Assert\Required([new Assert\Email()]),
    ]
)]

https://symfony.com/blog/new-in-symfony-5-4-nested-validation-attributes

评论

0赞 Adrien G 1/16/2023
我认为这些约束适用于基于文档的数组(或可遍历对象)。