如何创建自定义验证约束

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何创建自定义验证约束

您可以通过扩展基约束类来创建自定义约束,约束.作为示例,您将创建一个简单的验证器,用于检查字符串是否只包含字母数字字符。

创建约束类

首先,您需要创建一个Constraint类并进行扩展约束

12 3 4 5 6 7 8 9 10 11 12
/ / src / AppBundle /验证器/约束/ ContainsAlphanumeric.php名称空间AppBundle验证器约束使用ob娱乐下载组件验证器约束/ * * *@Annotation* /ContainsAlphanumeric扩展约束公共消息字符串“%string%”包含非法字符:它只能包含字母或数字。;}

请注意

@Annotation注释对于这个新约束来说是必要的,以便可以通过注释在类中使用它。约束的选项在约束类上表示为公共属性。

创建验证器本身

如您所见,约束类是相当小的。实际的验证由另一个“约束验证器”类执行。约束验证器类由约束的类指定validatedBy ()方法,其中包括一些简单的默认逻辑:

1 2 3 4 5
//在Symfony基本的\Cob娱乐下载omponent\Validator\Constraint类公共函数validatedBy()返回get_class ().“验证”;}

换句话说,如果您创建了一个自定义约束(如。MyConstraint), ob娱乐下载Symfony会自动寻找另一个类,MyConstraintValidator在实际执行验证时。

验证器类也很简单,只有一个必需的方法validate ()

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/ / src / AppBundle /验证器/约束/ ContainsAlphanumericValidator.php名称空间AppBundle验证器约束使用ob娱乐下载组件验证器约束使用ob娱乐下载组件验证器ConstraintValidatorContainsAlphanumericValidator扩展ConstraintValidator公共函数验证价值、约束约束如果(!preg_match (' / ^ [a-zA-Za0-9] + $ / '价值匹配)) {//如果你正在使用新的2.5验证API(你可能是!)->上下文->buildViolation (约束->消息)->setParameter (“%字符串%”价值->addViolation ();//如果你正在使用旧的2.4验证API/* $this->context->addViolation($constraint->message, array('%string%' => $value));* /}}}

内部验证,则不需要返回值。相反,您可以在验证器中添加违例上下文属性和值将被认为是有效的,如果它没有导致违规。的buildViolation方法将错误消息作为其参数,并返回ConstraintViolationBuilderInterface.的addViolation方法调用最后将违例添加到上下文。

2.5

buildViolation方法是在Symfony 2.5中添加的。ob娱乐下载有关旧Symfony版本的使用示例,请参阅本文档页面的相应版ob娱乐下载本。欧宝官网下载app

使用新的验证器

使用自定义验证器非常简单,就像Symfony本身提供的那样:ob娱乐下载

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5 6
# src / AppBundle /资源/ config / validation.ymlAppBundle \ \ AcmeEntity实体:属性:名称:-NotBlank:-AppBundle \验证器\ \ ContainsAlphanumeric约束:

如果约束包含选项,那么它们应该是前面创建的自定义constraint类上的公共属性。这些选项可以像Symfony核心约束上的选项一样配置。ob娱乐下载

带有依赖项的约束验证器

如果约束验证器具有依赖项,例如数据库连接,则需要将其配置为依赖项注入容器中的服务。此服务必须包括validator.constraint_validator标签和别名属性:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / services.yml服务:validator.unique.your_validator_name:类:完全限定\ \验证器类\ \的名字标签:-名称:validator.constraint_validator,别名:alias_name

你的约束类现在应该使用这个别名来引用适当的验证器:

1 2 3 4
公共函数validatedBy()返回“alias_name”;}

如上所述,Symfony将自动查找以约束ob娱乐下载命名的类验证器附加。如果约束验证器定义为服务,则重写validatedBy ()方法返回定义服务时使用的别名,否则Symfony将不使用约束验证器服务,而是实例化类,不注入任何依赖项。ob娱乐下载

类约束验证器

除了验证类属性外,约束还可以通过在类属性中提供目标来具有类作用域约束类:

1 2 3 4
公共函数getTargets()返回自我::CLASS_CONSTRAINT;}

有了这个,验证器validate ()方法获取一个对象作为其第一个参数:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
ProtocolClassValidator扩展ConstraintValidator公共函数验证协议、约束约束如果协议->getFoo () ! =协议->getBar ()) {//如果你正在使用新的2.5验证API(你可能是!)->上下文->buildViolation (约束->消息)->atPath (“foo”->addViolation ();//如果你正在使用旧的2.4验证API/* $this->context->addViolationAt('foo', $constraint->message, array(), null);* /}}}

注意,类约束验证器应用于类本身,而不是属性:

  • YAML
  • 注释
  • XML
1 2 3 4
# src / AppBundle /资源/ config / validation.ymlAppBundle \ \ AcmeEntity实体:约束:-AppBundle \验证器\ \ ContainsAlphanumeric约束:
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。