验证

编辑本页

警告:您正在浏览的文档欧宝体育电话<一个href="//www.oldmanjams.com/releases/2.0">欧宝娱乐app下载地址Symfony 2.0,现已不再维护。

读<一个href="//www.oldmanjams.com/doc/current/validation.html">本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

验证

验证是web应用程序中非常常见的任务。表单中输入的数据需要验证。在将数据写入数据库或传递给web服务之前,还需要对数据进行验证。

欧宝娱乐app下载地址Symfony2带有<一个href="https://github.com/symfony/Validator" class="reference external" rel="external noopener noreferrer" target="_blank">验证器组件,使此任务变得简单和透明。该组件基于<一个href="http://jcp.org/en/jsr/detail?id=303" class="reference external" rel="external noopener noreferrer" target="_blank">JSR303 Bean验证规范

验证的基础知识

理解验证的最好方法是在实际中看到它。首先,假设你已经创建了一个普通的老php对象,你需要在应用程序的某个地方使用:

1 2 3 4 5 6 7
/ / src / Acme / / Author.php BlogBundle /实体名称空间AcmeBlogBundle实体作者公共的名字;}

到目前为止,这只是一个普通的类,在应用程序中发挥一定的作用。验证的目标是告诉您对象的数据是否有效。为此,您将配置一个规则列表(称为<一个href="//www.oldmanjams.com/doc/2.0/book/validation.html" class="reference internal">约束),对象必须遵循该规则才能有效。可以通过许多不同的格式(YAML、XML、注释或PHP)指定这些规则。

例如,保证美元的名字属性不为空,请添加以下内容:

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\作者:属性:名称:-NotBlank:

提示

保护属性和私有属性也可以被验证,以及“getter”方法(参见' validator-constraint-targets ')。

使用验证器服务

接下来,实际验证作者对象时,使用验证方法。验证器服务(类<一个href="https://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/Validator/Validator.php" class="reference external" title="验证器" rel="external noopener noreferrer" target="_blank">验证器).他们的工作验证器很容易:读取类的约束(即规则),并验证对象上的数据是否满足这些约束。如果验证失败,则返回一个错误数组。下面是一个控制器内部的简单例子:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ /……使用欧宝娱乐app下载地址组件HttpFoundation响应使用AcmeBlogBundle实体作者公共函数indexAction()作者作者();/ /……对$author对象做些什么验证器->get (“验证”);错误验证器->validate (作者);如果(数(错误) >0){返回响应(print_r (错误真正的));}其他的返回响应(“作者是合法的!”是的!”);}}

如果美元的名字属性为空时,您将看到以下错误消息:

1 2
Acme\BlogBundle\Author.name:该值不应该为空

方法中插入值的名字属性时,将显示快乐的成功消息。

提示

大多数情况下,您不会直接与验证器服务或需要担心打印出来的错误。大多数情况下,在处理提交的表单数据时将间接使用验证。有关更多信息,请参见<一个href="//www.oldmanjams.com/doc/2.0/book/validation.html" class="reference internal">验证

您还可以将错误集合传递到模板中。

1 2 3 4 5 6 7
如果(数(错误) >0){返回->呈现(“AcmeBlogBundle:作者:validate.html.twig”数组“错误”= >错误));}其他的/ /……

在模板中,你可以根据需要输出错误列表:

  • 嫩枝
  • PHP
1 2 3 4 5 6 7
{# src / Acme / BlogBundle /资源/视图/作者/ validate.html。树枝#}<h3>作者有以下错误h3><ul>{%错误%}中的错误<>{{错误。消息}}>{%endfor%}ul>

请注意

每个验证错误(称为“约束违反”)都由<一个href="https://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/Validator/ConstraintViolation.php" class="reference external" title="ConstraintViolation" rel="external noopener noreferrer" target="_blank">ConstraintViolation对象。

约束

验证器用于验证对象的约束(即规则)。为了验证对象,只需将一个或多个约束映射到其类,然后将其传递给验证器服务。

在幕后,约束只是一个执行断言语句的PHP对象。在现实生活中,约束条件可能是:“蛋糕不能烧焦”。在Sy欧宝娱乐app下载地址mfony2中,约束是类似的:它们是条件为真的断言。给定一个值,约束将告诉您该值是否符合约束的规则。

约束的配置

一些约束条件,比如<一个href="//www.oldmanjams.com/doc/2.0/reference/constraints/NotBlank.html" class="reference internal">NotBlank,是简单的,而其他的,如<一个href="//www.oldmanjams.com/doc/2.0/reference/constraints/Choice.html" class="reference internal">选择约束,有几个可用的配置选项。假设作者类还有另一个属性,性别可以设置为“male”或“female”:

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\作者:属性:性别:-选择:选择:(男,女),信息:选择一个有效的性别。

约束的选项总是可以作为数组传入。但是,有些约束也允许传递1的值。”默认的,选项代替数组。在的情况下选择约束,选择可以以这种方式指定选项。

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\作者:属性:性别:-选择:(男,女)

这纯粹是为了使约束的最常见选项的配置更短、更快。

如果您不确定如何指定一个选项,请检查API文档中的约束,或者始终传递一个选项数组(上面所示的第一个方法)来确保安全。欧宝体育电话

约束的目标

约束可以应用于类属性(例如。的名字)或公共getter方法(例如:getFullName).第一种方法最常见,也最容易使用,但第二种方法允许您指定更复杂的验证规则。

属性

验证类属性是最基本的验证技术。欧宝娱乐app下载地址Symfony2允许您验证私有、受保护或公共属性。下一个清单显示了如何配置firstName美元的属性作者类必须至少有3个字符。

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5 6
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\作者:属性:名字:-NotBlank:-最小长度:3.

getter

约束也可以应用于方法的返回值。欧宝娱乐app下载地址Symfony2允许您向任何名称以“get”或“is”开头的公共方法添加约束。在本指南中,这两种类型的方法都被称为“getter”。

这种技术的好处是它允许您动态地验证对象。例如,假设您希望确保密码字段与用户的名字不匹配(出于安全原因)。您可以通过创建isPasswordLegal方法,然后断言该方法必须返回真正的

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\作者:getter方法:passwordLegal:-“真正的”:信息:"密码与您的名字不匹配"

现在,创建isPasswordLegal ()方法,并包括您需要的逻辑:

1 2 3 4
公共函数isPasswordLegal()返回->firstName ! =->密码);}

请注意

眼尖的人会注意到,getter的前缀(“get”或“is”)在映射中被省略了。这允许您稍后将约束移动到具有相同名称的属性(反之亦然),而无需更改验证逻辑。

验证组

到目前为止,您已经能够向类添加约束,并询问该类是否传递了所有定义的约束。然而,在某些情况下,您只需要验证对象一些类的约束。为此,您可以将每个约束组织到一个或多个“验证组”中,然后仅针对一组约束应用验证。

例如,假设你有一个用户类,在用户注册和稍后用户更新他/她的联系信息时都使用:

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\用户:属性:电子邮件:-电子邮件:组:(登记)密码:-NotBlank:组:(登记)-最小长度:限制:7组:(登记)城市:-最小长度:2

在这个配置中,有两个验证组:

  • 默认的-包含未分配给任何其他组的约束;<李>用户-包含属于group的约束默认的(这个组对<一个href="//www.oldmanjams.com/doc/2.0/book/validation.html" class="reference internal">验证);<李>登记的约束电子邮件而且密码字段。

属性的第二个参数要告诉验证器使用特定的组,请将一个或多个组名传递给validate ()方法:

1
错误验证器->validate (作者数组“注册”));

如果未指定组,则属于组的所有约束默认的将被应用。

当然,您通常会通过表单库间接地使用验证。有关如何在表单中使用验证组的信息,请参见<一个href="//www.oldmanjams.com/doc/2.0/book/forms.html" class="reference internal">形式

组序列

在某些情况下,您希望按步骤验证组。要做到这一点,可以使用GroupSequence特性。在这种情况下,一个对象定义了一个组序列,然后按顺序验证组序列中的组。

提示

组序列不能包含组默认的,因为这会创建一个循环。相反,使用分组{名称}(如。用户)。

例如,假设你有一个用户类,并希望仅在所有其他验证都通过时验证用户名和密码是否不同(以避免出现多个错误消息)。

  • YAML
  • 注释
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\用户:group_sequence:-用户-严格的getter方法:passwordLegal:-“真正的”:信息:"密码与您的用户名不匹配"组:(严格的)属性:用户名:-NotBlank:密码:-NotBlank:

在本例中,它将首先验证组中的所有约束用户(与默认的组)。只有当该组中的所有约束都有效时,第二组,严格的,将被验证。

验证值和数组

到目前为止,您已经看到了如何验证整个对象。但有时,您只是想验证一个简单的值——比如验证一个字符串是否是有效的电子邮件地址。这其实很容易做到。从控制器内部看,它是这样的:

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
使用欧宝娱乐app下载地址组件验证器约束电子邮件/ /……公共函数addEmailAction电子邮件emailConstraint电子邮件();//所有约束"options"都可以这样设置emailConstraint->消息=“无效的电邮地址”//使用验证器来验证值errorList->get (“验证”->validateValue (电子邮件emailConstraint);如果(数(errorList) = =0){//这是一个有效的电子邮件地址,做点什么其他的//这不是有效的电子邮件地址errorMessageerrorList0->getMessage ();/ /……对错误做些什么/ /……

通过调用validateValue在验证器上,可以传入一个原始值和要验证该值的约束对象。类中提供了可用约束的完整列表以及每个约束的完整类名<一个href="//www.oldmanjams.com/doc/2.0/reference/constraints.html" class="reference internal">约束参考部分。

validateValue方法返回<一个href="https://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/Validator/ConstraintViolationList.php" class="reference external" title="ConstraintViolationList" rel="external noopener noreferrer" target="_blank">ConstraintViolationList对象,它的作用就像一个错误数组。集合中的每个错误都是一个<一个href="https://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/Validator/ConstraintViolation.php" class="reference external" title="ConstraintViolation" rel="external noopener noreferrer" target="_blank">ConstraintViolation对象,该对象在其' getMessage '方法中保存错误消息。

此工作,包括代码示例,是根据<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">创作共用BY-SA 3.0许可证。