如何创建自定义验证约束
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何创建自定义验证约束
您可以通过扩展基约束类来创建自定义约束,约束.作为示例,您将创建一个简单的验证器,用于检查字符串是否只包含字母数字字符。
创建约束类
首先,您需要创建一个Constraint类并进行扩展约束:
12 3 4 5 6 7 8 9 10 11 12
/ / src /验证器/约束/ ContainsAlphanumeric.php名称空间应用程序\验证器\约束;使用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 27 28 29 30 31 32
/ / src /验证器/约束/ ContainsAlphanumericValidator.php名称空间应用程序\验证器\约束;使用ob娱乐下载\组件\验证器\约束;使用ob娱乐下载\组件\验证器\ConstraintValidator;使用ob娱乐下载\组件\验证器\异常\UnexpectedTypeException;类ContainsAlphanumericValidator扩展ConstraintValidator{公共函数验证($价值、约束$约束){如果(!$约束运算符ContainsAlphanumeric) {扔新UnexpectedTypeException ($约束, ContainsAlphanumeric::类);}//自定义约束应该忽略null和空值//其他约束(NotBlank, notull,等等)处理这个如果(零= = =$价值||”= = =$价值) {返回;}如果(!is_string ($价值)) {扔新UnexpectedTypeException ($价值,“字符串”);}如果(!preg_match (' / ^ [a-zA-Z0-9] + $ / ',$价值,$匹配)) {$这->上下文->buildViolation ($约束->消息)->setParameter ('{{string}}',$价值)->addViolation ();}}}
内部验证
,则不需要返回值。相反,您可以在验证器中添加违例上下文
属性和值将被认为是有效的,如果它没有导致违规。的buildViolation ()
方法将错误消息作为其参数,并返回ConstraintViolationBuilderInterface.的addViolation ()
方法调用最后将违例添加到上下文。
使用新的验证器
使用自定义验证器看起来与使用Symfony本身提供的验证器相同:ob娱乐下载
- 注释
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /实体/ AcmeEntity.php使用ob娱乐下载\组件\验证器\约束作为断言;使用应用程序\验证器\约束作为AcmeAssert;类AcmeEntity{/ /……/ * * *@Assert\ NotBlank *@AcmeAssert\ ContainsAlphanumeric * /受保护的$的名字;/ /……}
如果约束包含选项,那么它们应该是前面创建的自定义constraint类上的公共属性。这些选项可以像Symfony核心约束上的选项一样配置。ob娱乐下载
带有依赖项的约束验证器
如果你在用默认的服务。yaml的配置,那么您的验证器已经注册为服务和标记用必要的validator.constraint_validator
.这意味着你可以注入服务或配置和其他服务一样。
类约束验证器
除了验证类属性外,约束还可以通过在类属性中提供目标来具有类作用域约束
类:
1 2 3 4
公共函数getTargets(){返回自我::CLASS_CONSTRAINT;}
有了这个,验证器validate ()
方法获取一个对象作为其第一个参数:
1 2 3 4 5 6 7 8 9 10 11
类ProtocolClassValidator扩展ConstraintValidator{公共函数验证($协议、约束$约束){如果($协议->getFoo () ! =$协议->getBar ()) {$这->上下文->buildViolation ($约束->消息)->atPath (“foo”)->addViolation ();}}}
提示
的atPath ()
方法定义验证错误关联的属性。使用任何有效的PropertyAccess语法来定义这个属性。
注意,类约束验证器应用于类本身,而不是属性:
- 注释
- YAML
- XML
1 2 3 4 5 6 7
/ * * *@AcmeAssert\ ContainsAlphanumeric * /类AcmeEntity{/ /……}