验证

5.3版本
欧宝娱乐app下载地址Symfony 5.3支持经过JoliCode

验证

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

欧宝娱乐app下载地址Symfony提供A.验证器组件为您处理此操作。该组件基于JSR303 Bean验证规范

安装

在应用程序中使用欧宝娱乐app下载地址Symfony Flex.,请在使用之前运行此命令以安装验证器:

1
$Composer需要Symfony欧宝娱乐app下载地址 / Validator Doctrine / Annotations

验证的基础知识

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

// src /实体/ author.php名称空间App \实体;班级作者{私人的美元的名字;}

到目前为止,这是一个普通的类,在您的申请中提供了一些目的。验证的目标是告诉您对象的数据是否有效。为此工作,您将配置规则列表(调用约束),对象必须遵循,才能有效。这些规则通常使用PHP代码或注释定义,但也可以定义为.yaml. xml文件里面的配置/验证器/目录:

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

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{/ * ** @Assert \ NotBlank* /私人的美元的名字;}
  • 属性
    1 2 3 4 5 6 7 8 9 10 11
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{#[assert \ notblank]私人的美元的名字;}
  • yaml.
    1 2 3 4 5
    #配置/验证器/ validation.yaml作者应用实体\ \属性名称-NotBlank
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13
    <! - 配置/ validator / validation.xml  - >< ?encoding="UTF-8"<约束映射xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd”>name =“app \ entity \作者”>name =“名称”><约束name =“不发布”/>< / constraint-mapping >
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址symfony \ component \ validator \ constraints \ notlank;使用欧宝娱乐app下载地址symfony \ component \ validator \ mapping \ classmetadata;班级作者{私人的美元的名字;公共静止的函数loadvalidatormetadata.ClassMetadata美元元数据{美元元数据->addPropertyConstraint“名字”NotBlank());}}

小费

欧宝娱乐app下载地址Symfony的验证器使用PHP反射,以及“getter”方法,获取任何属性的价值,所以它们可以是公共,私人或保护的(见约束目标)。

使用验证仪服务

接下来,实际验证作者对象,使用validate ()对策验证器服务(它实现欧宝娱乐app下载地址Symfony \验证器\ \组件验证器\ ValidatorInterface)。这个工作验证器是读取类的约束(即规则),并验证对象上的数据是否满足这些约束。如果验证失败,一个非空的错误列表(欧宝娱乐app下载地址symfony \ component \ validator \ contrameviolationlist班级)返回。从控制器内部采用此简单示例:

// ......使用作者应用实体\ \;使用欧宝娱乐app下载地址symfony \ component \ httpfoundation \ response;使用欧宝娱乐app下载地址Symfony \验证器\ \组件验证器\ ValidatorInterface;// ......公共函数作者ValidatorInterface$验证器{美元的作者=作者();// ...为$ author对象做点什么美元的错误=$验证器->验证美元的作者);如果数数美元的错误>0.{/ **在$errors变量上使用__toString方法* ConstraintViolationList对象。这给了我们一个很好的字符串*调试。* /$错误=细绳美元的错误;返回响应$错误);}返回响应“作者有效!”是的!”);}

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

1 2
Object(App\Entity\Author).name:这个值不应该是空的

如果将值插入名称属性,将出现快乐的成功信息。

小费

大多数时候,您不会直接与验证器服务或需要担心打印错误。大多数情况下,在处理提交的表单数据时将间接使用验证。有关更多信息,请参见如何验证Symfony表单欧宝娱乐app下载地址

你也可以将错误集合传递到模板中:

如果数数美元的错误>0.{返回$这一点->渲染'作者/ validation.html.twig'['错误'=>美元的错误]);}

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

1 2 3 4 5 6 7
{#模板/作者/ validation.html.twig#}<H3.>作者有以下错误H3.><UL.>{%为了错误错误%}<>{{错误信息}}>{%终止%}UL.>

笔记

每个验证错误(称为“约束违反”)由欧宝娱乐app下载地址symfony \ component \ validator \ constraindviolation对象。

配置

在使用Symfony验证程序之前,欧宝娱乐app下载地址请确保在主配置文件中启用:

  • yaml.
    1 2 3
    #配置/包/ framework.yaml框架验证{启用真正的}
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13
    < !--config/packages/framework.xml -->< ?encoding="UTF-8"<容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony htps://www.oldmanjams.com/schema/dic/symfy/symfony-1.0.xsd“><框架:验证启用=“真正的”/>> < /容器
  • PHP
    1 2 3 4 5 6
    / /配置/包/ framework.php$容器->loadfromextension.“框架”[“验证”=>[“启用”=>真正的],]);

另外,如果你打算使用注解来配置验证,请用以下方式替换之前的配置:

  • yaml.
    1 2 3
    #配置/包/ framework.yaml框架验证{enable_annotations真正的}
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13
    < !--config/packages/framework.xml -->< ?encoding="UTF-8"<容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony htps://www.oldmanjams.com/schema/dic/symfy/symfony-1.0.xsd“><框架:验证启用 - 注释=“真正的”/>> < /容器
  • PHP
    1 2 3 4 5 6
    / /配置/包/ framework.php$容器->loadfromextension.“框架”[“验证”=>[“enable_annotations”=>真正的],]);

小费

使用PHP,YAML和XML文件而不是注释时,Symfony在默认情况下查找欧宝娱乐app下载地址配置/验证器/目录,但您可以使用该目录配置其他目录validation.mapping.paths选择。

约束

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

在幕后,约束只是一个生成断言语句的PHP对象。在现实生活中,约束可能是:'这蛋糕必须不是燃烧的。在Sy欧宝娱乐app下载地址mfony中,约束类似:它们是断言,即条件是真的。给定值,约束将告诉您该值是否遵守约束规则。

支持限制

欧宝娱乐app下载地址Symfony软件包许多最常用的约束:

基本的约束

这些是基本约束:使用它们来声明对象上的属性值或对象上方法的返回值的基本事项。

文件约束

财务和其他数量限制

其他限制

您还可以创建自己的自定义约束。本主题涵盖如何创建自定义验证约束文章。

约束配置

一些约束,就像NotBlank,很简单,而其他人则喜欢选择约束,有多个配置选项可用。假设这一点作者班级有另一个叫做的财产类型这定义了与作者相关的文献类型,可以设置为“虚构”或“非虚构”:

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{/ * ** @assert \ choice(* choices = {"fiction", "non-fiction"},* message = "选择一个有效的体裁。"*)* /私人的$类型;// ......}
  • 属性
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{#[assert \ choice(选择['小说''非小说'],信息'选择有效的类型。')]私人的$类型;// ......}
  • yaml.
    1 2 3 4 5 6
    #配置/验证器/ validation.yaml作者应用实体\ \属性类型-选择{选择[小说非小说],信息选择有效的类型。}#...
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21
    <! - 配置/ validator / validation.xml  - >< ?encoding="UTF-8"<约束映射xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd”>name =“app \ entity \作者”>name =“类型”><约束name =“选择”><选项name =“选择”>小说< /值>非小说< /值><选项name =“信息”>选择有效的类型。< !--。。。-->< / constraint-mapping >
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;使用欧宝娱乐app下载地址symfony \ component \ validator \ mapping \ classmetadata;班级作者{私人的$类型;// ......公共静止的函数loadvalidatormetadata.ClassMetadata美元元数据{// ......美元元数据->addPropertyConstraint“类型”维护\选择([“选择”=>['小说''非小说'],'信息'=>'选择有效的类型。')));}}

约束的选项始终可以作为数组传递。但是,一些约束也允许您通过一个值,“默认的“,选择代替阵列。在...的情况下选择约束,选择可以用这种方式指定选项。

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{/ * ** @assert \ choice({“小说”,“非虚构”})* /私人的$类型;// ......}
  • 属性
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{#[assert \ choice(['小说','非虚构'])]私人的$类型;// ......}
  • yaml.
    1 2 3 4 5 6
    #配置/验证器/ validation.yaml作者应用实体\ \属性类型-选择[小说非小说]#...
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18
    <! - 配置/ validator / validation.xml  - >< ?encoding="UTF-8"<约束映射xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd”>name =“app \ entity \作者”>name =“类型”><约束name =“选择”>小说< /值>非小说< /值>< !--。。。-->< / constraint-mapping >
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;使用欧宝娱乐app下载地址symfony \ component \ validator \ mapping \ classmetadata;班级作者{私人的$类型;公共静止的函数loadvalidatormetadata.ClassMetadata美元元数据{// ......美元元数据->addPropertyConstraint“类型”维护\选择(['小说''非小说']));}}

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

如果您不确定如何指定选项,请检查命名空间欧宝娱乐app下载地址Symfony \组件\验证器\约束对于约束或通过始终传递在一系列选项(上面显示的第一个方法)安全。

表单类中的约束

控件在构建表单时可以定义约束约束表单字段的选项:

公共函数建筑物FormBuilderInterface.$ Builder.数组$选项{$ Builder.->添加“myField”TextType::班级['必需的'=>真正的'限制'=>[长度(['min'=>3.])),]);}

约束目标

约束可以应用于类属性(例如名称),一个公共的getter方法(例如。getFullName ())或整个班级。属性约束是最常见且易于使用的。getter Constraints允许您指定更复杂的验证规则。最后,类约束适用于您想要验证整个类的场景。

特性

验证类属性是最基本的验证技术。欧宝娱乐app下载地址symfony允许您验证私有,受保护或公共属性。下一个列表向您展示了如何配置$ firstname.财产的作者班级至少有3个字符。

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // src /实体/ author.php// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{/ * ** @Assert \ NotBlank* @Assert \长度(min = 3)* /私人的$ firstname.;}
  • 属性
    1 2 3 4 5 6 7 8 9 10 11
    // src /实体/ author.php// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{#[assert \ notblank]#(断言\长度(分钟:3))私人的$ firstname.;}
  • yaml.
    1 2 3 4 5 6 7
    #配置/验证器/ validation.yaml作者应用实体\ \属性-NotBlank-长度最小值3.
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <! - 配置/ validator / validation.xml  - >< ?encoding="UTF-8"<约束映射xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd”>name =“app \ entity \作者”>name =“名”><约束name =“不发布”/><约束name =“长度”><选项name =“最小值”>3.< / constraint-mapping >
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 17 18 19 20
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;使用欧宝娱乐app下载地址symfony \ component \ validator \ mapping \ classmetadata;班级作者{私人的$ firstname.;公共静止的函数loadvalidatormetadata.ClassMetadata美元元数据{美元元数据->addPropertyConstraint“firstName”assert \ notblank.());美元元数据->addPropertyConstraint“firstName”维护\长度(['min'=>3.]));}}

警告

验证器将使用一个值如果类型化属性未初始化。如果属性在初始化时持有一个值,这可能会导致意外的行为。为了避免这种情况,请确保在验证所有属性之前都已初始化。

getter

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

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

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{/ * ** @assert \ istrue(消息=“密码无法符合您的名字”)* /公共函数ispasswordsafe.(){// ...返回true或false}}
  • 属性
    12 3 4 5 6 7 8 9 10 11 12 13 14
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;班级作者{#[Assert\IsTrue(信息:' password cannot match your first name')]公共函数ispasswordsafe.(){// ...返回true或false}}
  • yaml.
    1 2 3 4 5
    #配置/验证器/ validation.yaml作者应用实体\ \过时passwordsafe.-“IsTrue”{信息'这密码不能匹配你的第一的名称'}
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    <! - 配置/ validator / validation.xml  - >< ?encoding="UTF-8"<约束映射xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”XMLNS:XSI =“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd”>name =“app \ entity \作者”>属性=“passwordsafe”><约束name =“是真的”><选项name =“信息”>密码不能与您的名字匹配< / constraint-mapping >
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    // src /实体/ author.php名称空间App \实体;// ......使用欧宝娱乐app下载地址Symfony \组件\验证器\约束作为断言;使用欧宝娱乐app下载地址symfony \ component \ validator \ mapping \ classmetadata;班级作者{公共静止的函数loadvalidatormetadata.ClassMetadata美元元数据{美元元数据->addGetterConstraint'passwordsafe'维护\ IsTrue(['信息'=>“密码无法符合您的名字”)));}}

现在,创造isPasswordSafe ()方法并包含你需要的逻辑:

公共函数ispasswordsafe.(){返回$这一点->!==$这一点->密码;}

笔记

在YAML,XML和PHP格式的映射中,您将注意到您的敏锐眼睛(“得到”,“”或“具有”或“具有”)。这允许您稍后将约束移动到具有相同名称的属性(或反之亦然)而不更改验证逻辑。

某些约束适用于已验证的整个类。例如,回调约束是应用于类本身的通用约束。验证该类时,通过该约束指定的方法简单地执行,以便每个可以提供更多自定义验证。

调试的约束

5.2版中的新增功能:调试:验证器命令是在Symfony 5.2中引入的。欧宝娱乐app下载地址

使用调试:验证器命令列出给定类的验证约束:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21
$PHP BIN / CONSOLE调试:验证器'app \ entity \ someclass'app \ entity \ someclass-------------------------------------------------------------------+ -------------- + --------------------------------------------------------- + -------------------------------------------------------------|属性| Name | Groups | Options |+ -------------- + --------------------------------------------------------- + -------------------------------------------------------------|Firstargument |欧宝娱乐app下载地址symfony \ component \ validator \ constraints \ notlank |默认[|||||“消息”=>“这个值不应该是空的。”|||||“allownull”=>错误的,|| | | | "normalizer" =>空,|| | | | "payload" =>|||||] ||Firstargument |欧宝娱乐app下载地址symfony \ component \ validator \ constraints \ moder |默认[|||||“消息”=>“此值不是有效的电子邮件地址。”|| | | | "mode" =>空,|| | | | "normalizer" =>空,|| | | | "payload" =>|||||] |+ -------------- + --------------------------------------------------------- + -------------------------------------------------------------

您还可以验证存储在给定目录中的所有类:

1
$PHP BIN / CONSOLE调试:验证器SRC /实体

最后的想法

Symf欧宝娱乐app下载地址ony的验证器是一个功能强大的工具,可以利用以保证任何对象的数据是“有效”。验证的电源位于“约束”中,这是您可以应用于对象的属性或Getter方法的规则。虽然您最常在使用表单时常用的验证框架,但请记住它可以使用任何位置验证任何对象。

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0执照。