如何创建一个定制的验证约束
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何创建一个定制的验证约束
您可以创建一个自定义约束通过扩展基础约束类,约束。例如你要创建一个简单的验证器,检查一个字符串是否只包含字母数字字符。
创建约束类
首先,您需要创建一个约束类和扩展约束:
1 2 3 4 5 6 7 8 9 10 11 12
/ / src /验证器/约束/ ContainsAlphanumeric.php名称空间应用程序\验证器\约束;使用ob娱乐下载\组件\验证器\约束;/ * * *@Annotation* /类ContainsAlphanumeric扩展约束{公共美元消息=的字符串“{{字符串}}”包含非法字符:它只能包含字母或数字。;}
请注意
的@Annotation
注释是必要的对于这一新的约束,以使其在类通过使用注释。选择你的约束表示为约束类的公共属性。
创建验证器本身
正如你所看到的,一个约束类相当最小。实际的验证是由另一个“约束验证器”类。指定的约束验证器类约束的validatedBy ()
方法,其中包括一些简单的缺省逻辑:
1 2 3 4 5
/ /在基地Symfony \ob娱乐下载 \验证器\约束类组件公共函数validatedBy(){返回\ get_class (美元这)。“验证”;}
换句话说,如果你创建一个自定义约束
(如。MyConstraint
),Sob娱乐下载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名称空间应用程序\验证器\约束;使用ob娱乐下载\组件\验证器\约束;使用ob娱乐下载\组件\验证器\ConstraintValidator;使用ob娱乐下载\组件\验证器\异常\UnexpectedTypeException;使用ob娱乐下载\组件\验证器\异常\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本身:ob娱乐下载
- 注释
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /实体/ AcmeEntity.php使用应用程序\验证器\约束作为AcmeAssert;使用ob娱乐下载\组件\验证器\约束作为断言;类AcmeEntity{/ /……/ * * *@Assert\ NotBlank *@AcmeAssert\ ContainsAlphanumeric * /受保护的美元的名字;/ /……}