验证是Web应用程序中非常常见的任务。填入表单的数据需要验证,在它们被写入数据库或被发送给Web服务时也需要验证。

Symfony2附带的Validator组件使这个任务变得简单和透明。该组件基于JSR303 Bean验证规范。什么?在PHP中使用JAVA规范?你没听错,但它并不象听上去那么糟。让我们看看它是怎么在PHP使用的。

验证基础

最好的理解验证的方式就是在实战中学习。开始先假设你已经创建了一个简单PHP对象(plain-old-PHP-Object,简称POPO),你需要它在你应用程序中使用:

  1. // Acme/BlogBundle/Author.php
  2. class Author
  3. {
  4. public $name;
  5. }

目前为止,这还只是个普通的类,它在你的应用程序中实现一些目标。验证的目的就是要告诉你对象中的数据是否合法。为了能够进行验证,你需要配置一个对象必须遵循的规则列表(称为限制)。这些规则可以通过不同的格式(YAML、XML、注释或PHP)来指定。为了保证$name属性非空,必须添加下列内容:

  1. # Acme/BlogBundle/Resources/config/validation.yml
  2. Acme\BlogBundle\Author:
  3. properties:
  4. name:
  5. - NotBlank: ~

象“getter“一样,保护和私有属性也可以被验证(参见validator-constraint-targets)

使用验证服务

要验证Author对象,需要使用验证服务(Validator类)的validate方法。验证工作的容易的:查看类限制(如规则)并验证对象数据是否符合那些限制。如果验证失败,则返回一个错误数组。下面的来自控制器内部的简单示例:

  1. use Symfony\Component\HttpFoundation\Response;
  2. // ...
  3. public function indexAction()
  4. {
  5. $author = new Acme\BlogBundle\Author();
  6. // ... do something to the $author object
  7. $validator = $container->get('validator');
  8. $errorList = $validator->validate($author);
  9. if (count($errorList) > 0) {
  10. return new Response(print_r($errorList, true));
  11. } else {
  12. return new Response('The author is valid! Yes!');
  13. }
  14. }

如果$name属性为空,你将看到如下错误信息:

  1. Acme\BlogBundle\Author.name:
  2. This value should not be blank

如果你在name属性中插入值,那么得会出现验证成功的消息。

每个验证错误(称为“违反限制“),是由ConstraintViolation对象表现,该对象保持着一个描述错误的消息。此外validate方法返回一个类数组的ConstraintVoilationList对象。你还有很长的路要走,你可以用更先进的方式来使用验证并返回的错误。你可以先着色一个模板并将$errorList变量发送其中:

  1. if (count($errorList) > 0) {
  2. return $this->render('AcmeBlogBundle:Author:validate.html.twig', array(
  3. 'errorList' => $errorList,
  4. ));
  5. } else {
  6. // ...
  7. }

在模板中,你可以只输出你所需要的错误列表:

  1. {# src/Acme/BlogBundle/Resources/views/Author/validate.html.twig #}
  2. <h3>The author has the following errors</h3>
  3. <ul>
  4. {% for error in errorList %}
  5. <li>{{ error.message }}</li>
  6. {% endfor %}
  7. </ul>

验证和表单

无论何时,验证服务都可以用于验证任何对象。然而,实际上,你通常会通过Form类间接地使用验证。Form类使用验证服务在值被提交或约束时去验证底层对象。对象的限制约束被转换成FieldError对象,然后显示在你的表单中:

  1. $author = new Acme\BlogBundle\Author();
  2. $form = new Acme\BlogBundle\AuthorForm('author', $author, $this->get('validator'));
  3. $form->bind($this->get('request')->request->get('customer'));
  4. if ($form->isValid()) {
  5. // process the Author object
  6. } else {
  7. // render the template with the errors
  8. $this->render('BlogBundle:Author:form.html.twig', array('form' => $form));
  9. }

详情请参见表单章节。

配置

要使用Symfony2验证,需要确定它在你的应用程序配置中是可用的。

  1. # hello/config/config.yml
  2. framework:
  3. validation: { enabled: true, annotations: true }

如果你是通过注释映射限制的话,那么只需要将注释配置设置成true。

限制

验证是被设计用来验证对象是否违反限制(如规则)。要验证一个对象,只需简单地映射一个或多个限制到它的类,然后将其发送给验证服务。

限制简单地说是一个PHP对象,它生成一个限制规则的声明。在现实生活中,限制可以是“蛋糕不能燃烧”。在Symfony2中,限制也是相似的:它们被声明条件为真。指定一个值,限制将告诉你该值是否符合限制的规则。

限制支持

Symfony2包括了大量的常规限制。有关限制细节的完整列表可以在限制参考一节中找到。

配置限制

一些限制,如非空,是简单的。而其它的,如选择限制,则拥有几个可用的配置选项。这些可用选项在限制中是公共属性。通过发送一个选项数组给限制,它们中的每一个都可以被设置。假设Author类有另一个性别属性,该属性可以被设置成“男”或“女”:

  1. # Acme/BlogBundle/Resources/config/validation.yml
  2. Acme\BlogBundle\Author:
  3. properties:
  4. gender:
  5. - Choice: { choices: [male, female], message: Choose a valid gender. }

限制选项经常被作为数组发送。一些限制也允许你发送“缺省“选项到限制,以代替数组。在下面Choice限制的例子中,choices选项就是通过这一方式指定的:

  1. # Acme/BlogBundle/Resources/config/validation.yml
  2. Acme\BlogBundle\Author:
  3. properties:
  4. gender:
  5. - Choice: [male, female]

确保不要让指定选项的两个不同方法搞乱你。如果你不确定,检查限制的API文档或者总是发送选项数组(如上面第1种方法显示的那样),至少它是安全的。

限制的对象

限制可以被应用于一个类属性或一个公共的getter方法(如getFullName)。

属性

验证类属性是最基础的验证技巧。Symfony2允许你验证私有、保护和公共的属性。下面将向你展示如何配置Author类的$firstName和$lastName属性至少3个字符。

  1. # Acme/BlogBundle/Resources/config/validation.yml
  2. Acme\BlogBundle\Author:
  3. properties:
  4. firstName:
  5. - NotBlank: ~
  6. - MinLength: 3
  7. lastName:
  8. - NotBlank: ~
  9. - MinLength: 3

Getters

限制也可以应用在返回值的方法上。Symfony2允许你添加限制到任何名字中有着"get"或"is"的公共方法中。在本向导中,这两种类型的方法都被称为"getters“.

这种技巧的好处在于它允许你动态地验证你的对象。根据你对象的状态,方法返回不同值,然后验证。

下面将向你展示如何使用True限制去验证动态生成的令牌是否正确:

  1. # Acme/BlogBundle/Resources/config/validation.yml
  2. Acme\BlogBundle\Author:
  3. getters:
  4. tokenValid:
  5. - True: { message: "The token is invalid" }

公共的isTokenValid方法将执行一些逻辑去决定内部令牌是否合法,并返回true或false。

眼尖的你已经注意到getter的前缀("get"或"is")在映射中被忽略。这允许你将限制移到一个有着相同名字的属性(反之亦然),而无需改变你的验证逻辑。

最后一点

Symfony2验证器是一个强大的工具,它可以用来保证任何对象数据的“有效性”。验证背后的力量是“限制“,这是规则,你可以将其应用在属性或你对象的getter方法上。而你使用最常用的验证框架来间接地使用表单时,请记住,它可以在任何地方去验证任何对象。

本文转自 firehare 51CTO博客,原文链接:http://blog.51cto.com/firehare/581910,如需转载请自行联系原作者

Symfony2Book09:验证相关推荐

  1. form表单提交前进行ajax或js验证,校验不通过不提交

    在使用form表单进行提交数据前,需要进行数据的校验->表单的校验(如:两次密码输入是否相同)+后台数据的校验(如:账号是否存在),这个时候,如果哪步校验不通过,表单将停止提交,同时避免后台主键 ...

  2. SpringSecurity安全验证中文乱码问题

    使用SpringSecurity做安全验证时发现form表单中提交中文名会出现乱码问题. 原因是因为我在web.xml配置文件中将springSecurityFilterChain拦截器放在了 cha ...

  3. Ascend Pytorch算子功能验证

    Ascend Pytorch算子功能验证 编写测试用例 以add算子为例,测试脚本文件命名为:add_testcase.py.以下示例仅为一个简单的用例实现,具体算子的实现,需要根据算子定义进行完整的 ...

  4. 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练

    在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...

  5. 人脸真伪验证与识别:ICCV2019论文解析

    人脸真伪验证与识别:ICCV2019论文解析 Face Forensics++: Learning to Detect Manipulated Facial Images 论文链接: http://o ...

  6. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)

    上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...

  7. [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解

    模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...

  8. float js 正则 验证_使用HTML和Vuejs进行表单验证

    他们说大多数网络应用只是HTML表单.好吧,表单需要验证,谢天谢地,HTML5带有许多优秀的内置表单验证功能,可用于电子邮件,数字,最大值,分钟等.您甚至可以使用模式编写自己的验证规则.在本文中,我将 ...

  9. JQuery插件,轻量级表单模型验证(续 二)

    好不容易,有心思,那就把没做完的JQuery轻量级表单验证做完吧 之前做到了空参数验证的,现在增加带参数的验证. 附上html <form id="ValidataForm" ...

最新文章

  1. Facebook开源算法代码库,轻松复现前沿视频理解模型
  2. 那天的延长线在今天β
  3. maven 和eclipse插件
  4. WEB前端 Vue 全家桶介绍
  5. 【谷歌】Google Chrome 浏览器中 font-size 12px 没有效果
  6. 外链引入css有哪些方式_外链怎么发才会快速收录?
  7. mysql 查询语句属性值_MySQL学习——SQL查询语句(一)
  8. Bootstrap列表组禁用和活动状态
  9. mqtt 获取 状态_MQTT设备接入及上报数据的命令行模拟器(Java)
  10. 反编译工具Reflector ILSpy
  11. Matlab题目及答案,Matlab考试试题库+答案解析.doc
  12. 基本农田卫星地图查询_谷歌地图打不开?试试这个替代网站,街景功能很好用!...
  13. 华为android贡献度,米粉别不信,华为对安卓系统的贡献比小米更多
  14. Tether市值十月下跌超过10亿美元
  15. 使用cmd命令行查看Windows系统激活信息
  16. C语言中常用math函数
  17. 百度发展史,百度发展历程
  18. Android Studio连接手机设备教程(完全步骤)
  19. POJ 1659-Frog's Neighborhood
  20. 最新最全2011年-2020年中国统计年鉴面板数据excel

热门文章

  1. 云计算开启潘多拉星球时代
  2. 人之所以痛苦,在于追求错误的东西
  3. 生活中不得不了解的“垃圾人定律”
  4. WinForm制作文件传输助手,Tcp局域网传输文件,传输速度受限于宽带和硬盘速度上限
  5. B站发帖软件哪个好用?好用的哔哩哔哩发帖工具
  6. 计算机忽然打开东西特别慢,“我的电脑”中文件打开很慢的解决方案
  7. python 老男孩学习视频
  8. ADPCM音频格式详解 ADPCM_IMA ADPCM_DIV4
  9. 。求推荐一个usb集线器的购买网址
  10. 趋势科技PC-cillin2015,你来公測我发奖!