Symfony2Book09:验证
验证是Web应用程序中非常常见的任务。填入表单的数据需要验证,在它们被写入数据库或被发送给Web服务时也需要验证。
Symfony2附带的Validator组件使这个任务变得简单和透明。该组件基于JSR303 Bean验证规范。什么?在PHP中使用JAVA规范?你没听错,但它并不象听上去那么糟。让我们看看它是怎么在PHP使用的。
验证基础
最好的理解验证的方式就是在实战中学习。开始先假设你已经创建了一个简单PHP对象(plain-old-PHP-Object,简称POPO),你需要它在你应用程序中使用:
- // Acme/BlogBundle/Author.php
- class Author
- {
- public $name;
- }
目前为止,这还只是个普通的类,它在你的应用程序中实现一些目标。验证的目的就是要告诉你对象中的数据是否合法。为了能够进行验证,你需要配置一个对象必须遵循的规则列表(称为限制)。这些规则可以通过不同的格式(YAML、XML、注释或PHP)来指定。为了保证$name属性非空,必须添加下列内容:
- # Acme/BlogBundle/Resources/config/validation.yml
- Acme\BlogBundle\Author:
- properties:
- name:
- - NotBlank: ~
象“getter“一样,保护和私有属性也可以被验证(参见validator-constraint-targets)
使用验证服务
要验证Author对象,需要使用验证服务(Validator类)的validate方法。验证工作的容易的:查看类限制(如规则)并验证对象数据是否符合那些限制。如果验证失败,则返回一个错误数组。下面的来自控制器内部的简单示例:
- use Symfony\Component\HttpFoundation\Response;
- // ...
- public function indexAction()
- {
- $author = new Acme\BlogBundle\Author();
- // ... do something to the $author object
- $validator = $container->get('validator');
- $errorList = $validator->validate($author);
- if (count($errorList) > 0) {
- return new Response(print_r($errorList, true));
- } else {
- return new Response('The author is valid! Yes!');
- }
- }
如果$name属性为空,你将看到如下错误信息:
- Acme\BlogBundle\Author.name:
- This value should not be blank
如果你在name属性中插入值,那么得会出现验证成功的消息。
每个验证错误(称为“违反限制“),是由ConstraintViolation对象表现,该对象保持着一个描述错误的消息。此外validate方法返回一个类数组的ConstraintVoilationList对象。你还有很长的路要走,你可以用更先进的方式来使用验证并返回的错误。你可以先着色一个模板并将$errorList变量发送其中:
- if (count($errorList) > 0) {
- return $this->render('AcmeBlogBundle:Author:validate.html.twig', array(
- 'errorList' => $errorList,
- ));
- } else {
- // ...
- }
在模板中,你可以只输出你所需要的错误列表:
- {# src/Acme/BlogBundle/Resources/views/Author/validate.html.twig #}
- <h3>The author has the following errors</h3>
- <ul>
- {% for error in errorList %}
- <li>{{ error.message }}</li>
- {% endfor %}
- </ul>
验证和表单
无论何时,验证服务都可以用于验证任何对象。然而,实际上,你通常会通过Form类间接地使用验证。Form类使用验证服务在值被提交或约束时去验证底层对象。对象的限制约束被转换成FieldError对象,然后显示在你的表单中:
- $author = new Acme\BlogBundle\Author();
- $form = new Acme\BlogBundle\AuthorForm('author', $author, $this->get('validator'));
- $form->bind($this->get('request')->request->get('customer'));
- if ($form->isValid()) {
- // process the Author object
- } else {
- // render the template with the errors
- $this->render('BlogBundle:Author:form.html.twig', array('form' => $form));
- }
详情请参见表单章节。
配置
要使用Symfony2验证,需要确定它在你的应用程序配置中是可用的。
- # hello/config/config.yml
- framework:
- validation: { enabled: true, annotations: true }
如果你是通过注释映射限制的话,那么只需要将注释配置设置成true。
限制
验证是被设计用来验证对象是否违反限制(如规则)。要验证一个对象,只需简单地映射一个或多个限制到它的类,然后将其发送给验证服务。
限制简单地说是一个PHP对象,它生成一个限制规则的声明。在现实生活中,限制可以是“蛋糕不能燃烧”。在Symfony2中,限制也是相似的:它们被声明条件为真。指定一个值,限制将告诉你该值是否符合限制的规则。
限制支持
Symfony2包括了大量的常规限制。有关限制细节的完整列表可以在限制参考一节中找到。
配置限制
一些限制,如非空,是简单的。而其它的,如选择限制,则拥有几个可用的配置选项。这些可用选项在限制中是公共属性。通过发送一个选项数组给限制,它们中的每一个都可以被设置。假设Author类有另一个性别属性,该属性可以被设置成“男”或“女”:
- # Acme/BlogBundle/Resources/config/validation.yml
- Acme\BlogBundle\Author:
- properties:
- gender:
- - Choice: { choices: [male, female], message: Choose a valid gender. }
限制选项经常被作为数组发送。一些限制也允许你发送“缺省“选项到限制,以代替数组。在下面Choice限制的例子中,choices选项就是通过这一方式指定的:
- # Acme/BlogBundle/Resources/config/validation.yml
- Acme\BlogBundle\Author:
- properties:
- gender:
- - Choice: [male, female]
确保不要让指定选项的两个不同方法搞乱你。如果你不确定,检查限制的API文档或者总是发送选项数组(如上面第1种方法显示的那样),至少它是安全的。
限制的对象
限制可以被应用于一个类属性或一个公共的getter方法(如getFullName)。
属性
验证类属性是最基础的验证技巧。Symfony2允许你验证私有、保护和公共的属性。下面将向你展示如何配置Author类的$firstName和$lastName属性至少3个字符。
- # Acme/BlogBundle/Resources/config/validation.yml
- Acme\BlogBundle\Author:
- properties:
- firstName:
- - NotBlank: ~
- - MinLength: 3
- lastName:
- - NotBlank: ~
- - MinLength: 3
Getters
限制也可以应用在返回值的方法上。Symfony2允许你添加限制到任何名字中有着"get"或"is"的公共方法中。在本向导中,这两种类型的方法都被称为"getters“.
这种技巧的好处在于它允许你动态地验证你的对象。根据你对象的状态,方法返回不同值,然后验证。
下面将向你展示如何使用True限制去验证动态生成的令牌是否正确:
- # Acme/BlogBundle/Resources/config/validation.yml
- Acme\BlogBundle\Author:
- getters:
- tokenValid:
- - True: { message: "The token is invalid" }
公共的isTokenValid方法将执行一些逻辑去决定内部令牌是否合法,并返回true或false。
眼尖的你已经注意到getter的前缀("get"或"is")在映射中被忽略。这允许你将限制移到一个有着相同名字的属性(反之亦然),而无需改变你的验证逻辑。
最后一点
Symfony2验证器是一个强大的工具,它可以用来保证任何对象数据的“有效性”。验证背后的力量是“限制“,这是规则,你可以将其应用在属性或你对象的getter方法上。而你使用最常用的验证框架来间接地使用表单时,请记住,它可以在任何地方去验证任何对象。
本文转自 firehare 51CTO博客,原文链接:http://blog.51cto.com/firehare/581910,如需转载请自行联系原作者
Symfony2Book09:验证相关推荐
- form表单提交前进行ajax或js验证,校验不通过不提交
在使用form表单进行提交数据前,需要进行数据的校验->表单的校验(如:两次密码输入是否相同)+后台数据的校验(如:账号是否存在),这个时候,如果哪步校验不通过,表单将停止提交,同时避免后台主键 ...
- SpringSecurity安全验证中文乱码问题
使用SpringSecurity做安全验证时发现form表单中提交中文名会出现乱码问题. 原因是因为我在web.xml配置文件中将springSecurityFilterChain拦截器放在了 cha ...
- Ascend Pytorch算子功能验证
Ascend Pytorch算子功能验证 编写测试用例 以add算子为例,测试脚本文件命名为:add_testcase.py.以下示例仅为一个简单的用例实现,具体算子的实现,需要根据算子定义进行完整的 ...
- 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练
在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...
- 人脸真伪验证与识别:ICCV2019论文解析
人脸真伪验证与识别:ICCV2019论文解析 Face Forensics++: Learning to Detect Manipulated Facial Images 论文链接: http://o ...
- 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)
上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...
- [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解
模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...
- float js 正则 验证_使用HTML和Vuejs进行表单验证
他们说大多数网络应用只是HTML表单.好吧,表单需要验证,谢天谢地,HTML5带有许多优秀的内置表单验证功能,可用于电子邮件,数字,最大值,分钟等.您甚至可以使用模式编写自己的验证规则.在本文中,我将 ...
- JQuery插件,轻量级表单模型验证(续 二)
好不容易,有心思,那就把没做完的JQuery轻量级表单验证做完吧 之前做到了空参数验证的,现在增加带参数的验证. 附上html <form id="ValidataForm" ...
最新文章
- Facebook开源算法代码库,轻松复现前沿视频理解模型
- 那天的延长线在今天β
- maven 和eclipse插件
- WEB前端 Vue 全家桶介绍
- 【谷歌】Google Chrome 浏览器中 font-size 12px 没有效果
- 外链引入css有哪些方式_外链怎么发才会快速收录?
- mysql 查询语句属性值_MySQL学习——SQL查询语句(一)
- Bootstrap列表组禁用和活动状态
- mqtt 获取 状态_MQTT设备接入及上报数据的命令行模拟器(Java)
- 反编译工具Reflector ILSpy
- Matlab题目及答案,Matlab考试试题库+答案解析.doc
- 基本农田卫星地图查询_谷歌地图打不开?试试这个替代网站,街景功能很好用!...
- 华为android贡献度,米粉别不信,华为对安卓系统的贡献比小米更多
- Tether市值十月下跌超过10亿美元
- 使用cmd命令行查看Windows系统激活信息
- C语言中常用math函数
- 百度发展史,百度发展历程
- Android Studio连接手机设备教程(完全步骤)
- POJ 1659-Frog's Neighborhood
- 最新最全2011年-2020年中国统计年鉴面板数据excel
热门文章
- 云计算开启潘多拉星球时代
- 人之所以痛苦,在于追求错误的东西
- 生活中不得不了解的“垃圾人定律”
- WinForm制作文件传输助手,Tcp局域网传输文件,传输速度受限于宽带和硬盘速度上限
- B站发帖软件哪个好用?好用的哔哩哔哩发帖工具
- 计算机忽然打开东西特别慢,“我的电脑”中文件打开很慢的解决方案
- python 老男孩学习视频
- ADPCM音频格式详解 ADPCM_IMA ADPCM_DIV4
- 。求推荐一个usb集线器的购买网址
- 趋势科技PC-cillin2015,你来公測我发奖!