如何仅应用验证约束的子集(验证组)
默认情况下,当验证一个对象时,将检查该类的所有约束是否通过。然而,在某些情况下,您需要仅针对该类上的某些约束来验证对象。为此,您可以将每个约束组织成一个或多个“验证组”,然后针对一个约束组应用验证。
例如,假设您有一个 User
类,它既在用户注册时使用,也在用户稍后更新其联系信息时使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// src/Entity/User.php
namespace App\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
class User implements UserInterface
{
#[Assert\Email(groups: ['registration'])]
private string $email;
#[Assert\NotBlank(groups: ['registration'])]
#[Assert\Length(min: 7, groups: ['registration'])]
private string $password;
#[Assert\Length(min: 2)]
private string $city;
}
通过此配置,有三个验证组
默认
- 包含当前类和所有未归属于其他组的引用类中的约束。在此示例中,它仅包含
city
字段。 用户
- 等同于
User
对象在Default
组中的所有约束。这始终是类的名称。此组和Default
之间的区别在 如何顺序应用验证组 中进行了解释。 注册
- 这是一个自定义验证组,因此它仅包含显式与之关联的约束。在此示例中,仅包含
email
和password
字段。
类 Default
组中的约束是没有配置显式组,或者配置为等于类名或字符串 Default
的组的约束。
警告
当仅验证 User
对象时,Default
组和 User
组之间没有区别。但是,如果 User
有嵌入对象,则存在差异。例如,假设 User
有一个 address
属性,其中包含一些 Address
对象,并且您已将 Valid 约束添加到此属性,以便在您验证 User
对象时对其进行验证。
如果您使用 Default
组验证 User
,那么 Address
类中属于 Default
组的任何约束都将被使用。但是,如果您使用 User
验证组验证 User
,那么只有 Address
类中属于 User
组的约束才会被验证。
换句话说,Default
组和类名组(例如 User
)是相同的,除非该类嵌入到另一个实际正在被验证的对象中。
如果您有继承(例如 User extends BaseUser
)并且您使用子类的类名(即 User
)进行验证,那么 User
和 BaseUser
中的所有约束都将被验证。但是,如果您使用基类(即 BaseUser
)进行验证,那么只有 BaseUser
类中的默认约束将被验证。
要告诉验证器使用特定的组,请将一个或多个组名作为第三个参数传递给 validate()
方法
1
$errors = $validator->validate($author, null, ['registration']);
如果未指定组,则将应用属于 Default
组的所有约束。
在一个完整的 Symfony 项目中,您通常会通过表单库间接使用验证。有关如何在表单内使用验证组的信息,请参阅 如何定义要使用的验证组。