如何创建一个定制的验证约束

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

如何创建一个定制的验证约束

您可以创建一个自定义约束通过扩展基础约束类,约束。例如你要创建一个基本的验证器,检查一个字符串是否只包含字母数字字符。

创建约束类

首先,您需要创建一个约束类和扩展约束:

  • 注释
  • 属性
1 2 3 4 5 6 7 8 9 10 11 12
/ / src /验证器/ ContainsAlphanumeric.php名称空间应用程序\验证器;使用欧宝娱乐app下载地址\组件\验证器\约束;/ * * *@Annotation* /ContainsAlphanumeric扩展约束{公共美元消息=的字符串“{{字符串}}”包含非法字符:它只能包含字母或数字。;}

添加@Annotation# \[属性]约束类,如果你想使用它作为一个注释在其他类/属性。如果约束的配置选项,定义约束类的公共属性。

5.2

使用PHP的能力属性配置约束是在Symfony 5.2中引入的。欧宝娱乐app下载地址在这之前,教义注释标注约束的唯一方法。

创建验证器本身

正如你所看到的,一个约束类相当最小。实际的验证是由另一个“约束验证器”类。指定的约束验证器类约束的validatedBy ()方法,这个默认逻辑:

1 2 3 4 5
/ /在基地Symfony \欧宝娱乐app下载地址 \验证器\约束类组件公共函数validatedBy(){返回静态::类。“验证”;}

换句话说,如果你创建一个自定义约束(如。MyConstraint),S欧宝娱乐app下载地址ymfony会自动寻找另一个类,MyConstraintValidator当实际执行验证。

所需的确认器类只有一个方法validate ():

1 2 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 33 34 35 36 37 38
/ / src /验证器/ ContainsAlphanumericValidator.php名称空间应用程序\验证器;使用欧宝娱乐app下载地址\组件\验证器\约束;使用欧宝娱乐app下载地址\组件\验证器\ConstraintValidator;使用欧宝娱乐app下载地址\组件\验证器\异常\UnexpectedTypeException;使用欧宝娱乐app下载地址\组件\验证器\异常\UnexpectedValueException;ContainsAlphanumericValidator扩展ConstraintValidator{公共函数验证(美元价值、约束美元约束){如果(!美元约束运算符ContainsAlphanumeric) {UnexpectedTypeException (美元约束,ContainsAlphanumeric::类);}/ /自定义约束应该忽略null并允许空值/ /其他约束(NotBlank NotNull,等等)来照顾如果(= = =美元价值| |= = =美元价值){返回;}如果(! is_string (美元价值)){/ /抛出这个异常如果你的验证器不能处理传递的类型,这样就可以将标记为无效的UnexpectedValueException (美元价值,“字符串”);/ /单独使用管道多种类型/ /抛出新的UnexpectedValueException(美元值,字符串| int);}如果(! preg_match (' / ^ [a-zA-Z0-9] + $ / ',美元价值,美元匹配)){/ /参数必须是一个字符串或一个对象实现__toString ()美元- >上下文- >buildViolation (美元约束- >消息)- >setParameter (“{{字符串}}”,美元价值)- >addViolation ();}}}

内部验证,你不需要返回一个值。相反,你违规添加到验证器上下文属性和一个值将被认为是有效的,如果它没有造成侵犯。的buildViolation ()方法将错误消息作为它的参数,并返回的一个实例ConstraintViolationBuilderInterface。的addViolation ()方法调用最后将违反添加到上下文。

使用新确认器

您可以使用定制确认器所提供的Symfony本身:欧宝娱乐app下载地址

  • 注释
  • 属性
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /实体/ AcmeEntity.php名称空间应用程序\实体;使用应用程序\验证器作为AcmeAssert;使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;AcmeEntity{/ /……/ * * *@Assert\ NotBlank *@AcmeAssert\ ContainsAlphanumeric * /受保护的美元的名字;/ /……}

如果你的约束包含选项,那么他们应该在前面创建的自定义约束类公共属性。这些选项可以配置选项在核心Symfony约束。欧宝娱乐app下载地址

约束验证器和依赖关系

如果你使用默认的服务。yaml的配置,那么你的验证器已经注册为服务和标记必要的validator.constraint_validator。这意味着您可以注入服务或配置像任何其他服务。

创建一个可重用的一组约束

如果你需要应用一些常见组约束在应用程序之间不断的在不同的地方,您可以扩展复合约束

5.1

复合约束是在Symfony 5.1中引入的。欧宝娱乐app下载地址

类约束验证器

除了验证一个属性,一个约束可以有一个完整的类作为其范围。你只需要添加的约束类:

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
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
/ / src /实体/ AcmeEntity.php名称空间应用程序\实体;使用应用程序\验证器作为AcmeAssert;/ * * *@AcmeAssert\ ProtocolClass * /AcmeEntity{/ /……}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。