书籍Symfony 5:快速轨道欧宝娱乐app下载地址

欧宝娱乐app下载地址交响乐5:快车道是学习现代Symfony发展,从零到生产的最好书籍。欧宝娱乐app下载地址+300页展示Symfony与Docker,欧宝娱乐app下载地址 api,队列和异步任务,Webpack, spa等。

验证

验证

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

欧宝娱乐app下载地址Symfony提供了一个验证器组件来为您处理此问题。此组件基于JSR303 Bean验证规范

安装

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

1
编写器需要symfony/验证器原欧宝娱乐app下载地址则/注释

验证的基础

理解验证的最佳方法是在行动中看到它。要启动,假设您已创建了一个普通的PHP对象,您需要在应用程序中使用某个位置:

/ / src /实体/ Author.php命名空间应用程序\实体作者私人美元的名字

到目前为止,这是一个普通的类,在应用程序中有一些用途。验证的目的是告诉您对象的数据是否有效。为此,您将配置一个规则列表(称为约束)对象必须遵循以便有效。这些规则通常使用PHP代码或注释定义,但它们也可以定义为.yaml.或者.xml.文件内部配置/验证器/目录:

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

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者/ *** @assert \ notblank* /私人美元的名字
  • 属性
    1 2 3 4 5 6 7 8 9 10 11
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者#(断言\ NotBlank)私人美元的名字
  • YAML
    1 2 3 4 5
    #配置/验证器/ validation.yamlapp \ entity \作者特性的名字-不发
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13
    <!--配置/验证器/验证.xml.-- ><?XML Version =“1.0”编码=“UTF-8”?>< constraint-mappingXMLNS =.“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-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping--.0.xsd“><类名称=“应用程序作者\实体\”><属性名称=“名称”><约束名称=“不发布”/>> < /属性类> < /
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址Symfony \ \组件验证器\ \ NotBlank约束欧宝娱乐app下载地址Symfony \ \验证器\ \ ClassMetadata映射组件作者私人美元的名字上市静态功能loadValidatorMetadataclassmetadata.$元数据$元数据- >AddPropertyConstraint.'名称'新的不发());

提示

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

使用验证器服务

接下来,要实际验证作者对象,使用证实()方法验证器服务(实现欧宝娱乐app下载地址Symfony \ Component \ Validator \ Validator \ ValidatorInterface)。的工作验证器是读取类的约束(即规则)并验证对象上的数据是否满足这些约束。如果验证失败,则非空的错误列表(欧宝娱乐app下载地址Symfony \ \验证器\ ConstraintViolationList组件返回类)。以控制器内部的这个简单例子为例:

/ /……app \ entity \作者欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应欧宝娱乐app下载地址Symfony \ Component \ Validator \ Validator \ ValidatorInterface/ /……上市功能作者validatorInterface.美元的验证器$ author.新的作者();/ /……对$author对象做什么$错误美元的验证器- >证实$ author.);如果$错误>0/ **在$错误变量上使用__tostring方法,这是一个* ConstraintViolationList对象。这给了我们一个漂亮的字符串*进行调试。* /errorsString美元字符串$错误返回新的回复errorsString美元);返回新的回复'作者有效!是的!');

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

1 2
对象(App \ Entity \作者).name:此值不应为空

对象中插入一个值的名字属性,将显示成功消息。

提示

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

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

如果$错误>0返回这个美元- >使成为“作者/ validation.html.twig”“错误”=>$错误]);

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

1 2 3 4 5 6 7
{/作者/ validation.html #模板。树枝#}<h3>作者有以下错误h3><ul>{%错误错误%}<>{{error.message}}>{%endfor%}ul>

请注意

每个验证错误(称为“约束违规”)由a表示欧宝娱乐app下载地址symfony \ component \ validator \ constraindviolation目的。

配置

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

  • YAML
    1 2 3.
    #配置/包/ framework.yaml框架验证启用真的
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13
    <!--config/packages/framework.xml --><?XML Version =“1.0”编码=“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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd.http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:验证启用了=“真的”/>< /框架:配置>
  • PHP.
    1 2 3 4 5 6
    // config / packages / framework.php$容器- >loadFromExtension'框架''验证'=>“启用”=>真的],]);

此外,如果打算使用注释来配置验证,请按以下内容替换以前的配置:

  • YAML
    1 2 3.
    #配置/包/ framework.yaml框架验证启用_ annotations.真的
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13
    <!--config/packages/framework.xml --><?XML Version =“1.0”编码=“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/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd.http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:验证enable-annotations =“真的”/>< /框架:配置>
  • PHP.
    1 2 3 4 5 6
    // config / packages / framework.php$容器- >loadFromExtension'框架''验证'=>'Enable_Annotations'=>真的],]);

提示

当使用PHP、YAML和XML文件而不是注释时,Symfony默认在欧宝娱乐app下载地址配置/验证器/目录,但是您可以使用验证.mapping.paths.选项。

约束

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

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

支持的约束

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

基本限制

这些是基本的约束:使用它们来断言关于属性值或对象上方法的返回值的非常基本的东西。

选择限制条件

文件限制

其他约束

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

约束的配置

一些限制,比如不发,是简单的,而其他人,喜欢选择约束,有几个可用的配置选项。假设作者类具有另一个名为类型这定义了大多数与作者有关的文学类型,可以设置为“小说”或“非小说”:

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者/ *** @Assert \选择(*选择= {“小说”,“非小说”},*消息=“选择有效的类型”。*)* /私人美元的类型/ /……
  • 属性
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者#[断言\选择(选择“小说”“非小说”],消息“选择一个有效的题材。”私人美元的类型/ /……
  • YAML
    1 2 3 4 5 6
    #配置/验证器/ validation.yamlapp \ entity \作者特性类型-选择选择小说非小说类],消息选择一种有效的题材。#...
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
    <!--配置/验证器/验证.xml.-- ><?XML Version =“1.0”编码=“UTF-8”?>< constraint-mappingXMLNS =.“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-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping--.0.xsd“><类名称=“应用程序作者\实体\”><属性名称=“类型”><约束名称=“选择”><选项名称=“选择”><值>小说<值>非小说类> < /选项<选项名称=“消息”>选择一种有效的题材。> < /选项> < /约束> < /属性<! -  ...  - >类> < /
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言欧宝娱乐app下载地址Symfony \ \验证器\ \ ClassMetadata映射组件作者私人美元的类型/ /……上市静态功能loadValidatorMetadataclassmetadata.$元数据/ /……$元数据- >AddPropertyConstraint.'类型'新的assert \选择(['选择'=>“小说”“非小说”],“消息”=>“选择一个有效的题材。”]));

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

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13 14 15
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者/ *** @Assert \选择({“小说”,“非小说”})* /私人美元的类型/ /……
  • 属性
    12 3 4 5 6 7 8 9 10 11 12 13
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者#[断言\选择([“小说”,“非小说”]))私人美元的类型/ /……
  • YAML
    1 2 3 4 5 6
    #配置/验证器/ validation.yamlapp \ entity \作者特性类型-选择小说非小说类#...
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    <!--配置/验证器/验证.xml.-- ><?XML Version =“1.0”编码=“UTF-8”?>< constraint-mappingXMLNS =.“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-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping--.0.xsd“><类名称=“应用程序作者\实体\”><属性名称=“类型”><约束名称=“选择”><值>小说<值>非小说类> < /约束> < /属性<! -  ...  - >类> < /
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言欧宝娱乐app下载地址Symfony \ \验证器\ \ ClassMetadata映射组件作者私人美元的类型上市静态功能loadValidatorMetadataclassmetadata.$元数据/ /……$元数据- >AddPropertyConstraint.'类型'新的assert \选择([“小说”“非小说”]));

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

如果您不确定如何指定一个选项,可以检查名称空间欧宝娱乐app下载地址symfony \ component \ validator \ constraints为了保证约束或安全起见,总是传入一个选项数组(上面显示的第一个方法)。

表单类中的约束

通过通过该表格构建形式来定义约束约束表单字段的选项:

上市功能buildFormFormBuilderInterface美元的建造者大批选择美元美元的建造者- >添加'myfield'TextType.::“要求”=>真的“约束”=>新的长度([“最小值”=>3.])],])

约束的目标

约束可以应用于类属性(例如。的名字),一种公共吸气工方法(例如getfullname())或整个班级。属性约束是最常见和最容易使用的。Getter约束允许您指定更复杂的验证规则。最后,类约束适用于希望整体验证类的场景。

属性

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

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13
    / / src /实体/ Author.php/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者/ *** @assert \ notblank* @assert \长度(min = 3)* /私人firstName美元
  • 属性
    1 2 3 4 5 6 7 8 9 10 11
    / / src /实体/ Author.php/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者#(断言\ NotBlank)#[assert \长度(min:3)]私人firstName美元
  • YAML
    1 2 3 4 5 6 7
    #配置/验证器/ validation.yamlapp \ entity \作者特性firstName-不发-长度3.
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <!--配置/验证器/验证.xml.-- ><?XML Version =“1.0”编码=“UTF-8”?>< constraint-mappingXMLNS =.“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-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping--.0.xsd“><类名称=“应用程序作者\实体\”><属性名称=“firstName”><约束名称=“不发布”/><约束名称=“长度”><选项名称=“分钟”>3.> < /选项> < /约束> < /属性类> < /
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言欧宝娱乐app下载地址Symfony \ \验证器\ \ ClassMetadata映射组件作者私人firstName美元上市静态功能loadValidatorMetadataclassmetadata.$元数据$元数据- >AddPropertyConstraint.'名'新的维护\ NotBlank());$元数据- >AddPropertyConstraint.'名'新的断言\长度([“最小值”=>3.]));

谨慎

验证器将使用值空值如果键入的属性未初始化。如果属性在初始化时保持值,则会导致意外行为。为了避免这种情况,请确保在验证之前初始化所有属性。

getter

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

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

  • 注释
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者/ *** @Assert\IsTrue(消息="密码不能匹配你的名字")* /上市功能isPasswordSafe()/ /……返回真或假
  • 属性
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言作者#[assert \ istrue(消息:'密码不能符合您的名字')]上市功能isPasswordSafe()/ /……返回真或假
  • YAML
    1 2 3 4 5
    #配置/验证器/ validation.yamlapp \ entity \作者getterpasswordsafe.-'是真的'消息密码不能比赛你的第一个名字的
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15
    <!--配置/验证器/验证.xml.-- ><?XML Version =“1.0”编码=“UTF-8”?>< constraint-mappingXMLNS =.“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-mappinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping--.0.xsd“><类名称=“应用程序作者\实体\”>< getter属性=“passwordSafe”><约束名称=“IsTrue”><选项名称=“消息”>密码无法符合您的名字> < /选项> < /约束< / getter >类> < /
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    / / src /实体/ Author.php命名空间应用程序\实体/ /……欧宝娱乐app下载地址symfony \ component \ validator \ constraints作为断言欧宝娱乐app下载地址Symfony \ \验证器\ \ ClassMetadata映射组件作者上市静态功能loadValidatorMetadataclassmetadata.$元数据$元数据- >AddgetterConstraint.“passwordSafe”新的assert \ istrue.([“消息”=>'密码不能匹配你的名字']));

现在,创建ispasswordsafe()方法并包括所需的逻辑:

上市功能isPasswordSafe()返回这个美元- >firstName= = !这个美元- >密码

请注意

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

班级

一些约束适用于被验证的整个类。例如,打回来约束是应用于类本身的泛型约束。当验证该类时,将简单地执行该约束指定的方法,以便每个方法都可以提供更多自定义验证。

调试约束

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

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
php bin /控制台调试:验证器“App \实体\ SomeClass”应用\ \ SomeClass实体-----------------------------------------------------+---------------+--------------------------------------------------+---------+------------------------------------------------------------+|物业|名称|组|选择|+---------------+--------------------------------------------------+---------+------------------------------------------------------------+| firstArgument | 欧宝娱乐app下载地址Symfony\Component\Validator\Constraints\NotBlank | Default | [| .| | | | "message" =>这个值不应该是空的。|| | | | "allowNull" =>假的,|| | | | "normalizer" =>空值,|||||“有效载荷”=>空值|| | | |] |Symfony\Component\欧宝娱乐app下载地址Validator\Constraints\Email |默认值| [|| | | | "message" =>这个值不是一个有效的电子邮件地址。|||||“模式”=>空值,|| | | | "normalizer" =>空值,|||||“有效载荷”=>空值|| | | |] |+---------------+--------------------------------------------------+---------+------------------------------------------------------------+

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

1
php bin/console调试:validator src/Entity

最终的想法

symf欧宝娱乐app下载地址ony.验证器是一个强大的工具,可以利用它来确保任何对象的数据是“有效的”。验证背后的力量在于“约束”,这些规则可以应用于对象的属性或getter方法。虽然在使用表单时通常会间接地使用验证框架,但请记住,它可以在任何地方用于验证任何对象。

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0许可证。