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

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

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

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

创建约束类

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

1 2 3 4 5 6 7 8 9 10 11 12
/ / src / AppBundle /验证器/约束/ ContainsAlphanumeric.php名称空间AppBundle\验证器\约束;使用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日
/ / src / AppBundle /验证器/约束/ ContainsAlphanumericValidator.php名称空间AppBundle\验证器\约束;使用ob娱乐下载\组件\验证器\约束;使用ob娱乐下载\组件\验证器\ConstraintValidator;ContainsAlphanumericValidator扩展ConstraintValidator{公共函数验证(美元价值、约束美元约束){如果(! preg_match (' / ^ [a-zA-Z0-9] + $ / ',美元价值,美元匹配)){/ /如果你使用新的2.5验证API(你可能!)美元- >上下文- >buildViolation (美元约束- >消息)- >setParameter (“%字符串%”,美元价值)- >addViolation ();/ /如果你使用旧的2.4验证API/ * $ this - >内容- > addViolation($约束- >消息数组(' %字符串% ' = >美元值));* /}}}

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

2.5

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

使用新确认器

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

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / AppBundle /实体/ AcmeEntity.php使用ob娱乐下载\组件\验证器\约束作为断言;使用AppBundle\验证器\约束作为AcmeAssert;AcmeEntity{/ /……/ * * *@Assert\ NotBlank *@AcmeAssert\ ContainsAlphanumeric * /受保护的美元的名字;/ /……}

如果你的约束包含选项,那么他们应该在前面创建的自定义约束类公共属性。这些选项可以配置选项在核心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 ()方法得到一个对象作为它的第一个参数:

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

注意,一个类约束验证器应用于类本身,而不是财产:

  • 注释
  • YAML
  • XML
1 2 3 4 5 6 7
/ * * *@AcmeAssert\ ContainsAlphanumeric * /AcmeEntity{/ /……}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。