Symfony数据校验方法实例分析
这篇文章主要介绍了Symfony数据校验方法,实例分析了Symfony数据校验的常见技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了Symfony数据校验方法。分享给大家供大家参考。具体分析如下:
校验在web应用程序中是一个常见的任务。数据输入到表单需要被校验。数据在被写入数据库之前或者传入一个webservice时也需要被校验。
Symfony2 配备了一个Validator 组件,它让校验工作变得简单易懂。该组件是基于JSR303 Bean校验规范。一个Java规范用在PHP中。
基本验证
理解校验的最好方法是看它的表现。首先,假设你已经创建了一个用于你应用程序某个地方的PHP对象。
复制代码 代码如下:
//src/Acme/BlogBundle/Entity/Author.php
namespace Acme\BlogBundle\Entity;
class Author
{
public $name;
}
到现在为止,它只是个服务于你应用程序的某些目的的普通的类。而校验的目的就是要告诉你对象的数据是否合法。为了这个目的,你需要配置一个对象必须遵守规则或者约束列表来让自己的数据合法。这些规则可以被描述成多种不同的格式的(比如,YAML,XML,类声明或者PHP)。比如,我们保证属性$name不能为空,来添加下面的规则:
YAML格式:
复制代码 代码如下:
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
name:
- NotBlank: ~
类声明格式:
复制代码 代码如下:
// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\NotBlank()
*/
public $name;
}
XML格式:
复制代码 代码如下:
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping ">
PHP代码格式:
复制代码 代码如下:
// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
class Author
{
public $name;
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('name', new NotBlank());
}
}
Protected和private属性以及getter方法也都可以被校验。
使用validator服务:
接下来,使用validator服务的validate方法来真正的校验Author对象。 validator的工作很简单:读取一个类的约束规则来校验一个对象的数据是否符合这些规则约束。如果校验失败,一个错误数组将被返回。现在我们在一个controller中来执行它:
复制代码 代码如下:
use Symfony\Component\HttpFoundation\Response;
use Acme\BlogBundle\Entity\Author;
//...
public function indexAction()
{
$author = new Author();
//... 对$auother对象做些什么
$validator = $this->get('validator');
$errors = $validator->validate($author);
if(count($errors) >0){
return new Response(print_r($errors, true));
}else{
return new Response('The author is valid! Yes!');
}
}
如果$name 属性为空,你将看到下面的错误信息:
Acme\BlogBundle\Author.name:
This value should not be blank
如果你为$name属性插入一个值,那么你会获得快乐的成功信息。
大多数时候,你不需要直接跟validator服务交流或者根本不需要担心打印出错误来。
大多数情况下,你将在处理提交表单数据时间接使用校验。
你也可以传递一个错误信息集合到一个模版:
复制代码 代码如下:
if(count($errors)>0){
return $this->render('AcmeBlogBundle:Author:validate.html.twig',array(
'errors' => $errors,
));
}else{
//...
}
在模版中,你可以根据需要精确的输出错误列表:
Twig格式:
复制代码 代码如下:
{# src/Acme/BlogBundle/Resources/views/Author/validate.html.twig #}
The author has the following errros
- {{ error.message }}
{% for error in errors %}
{% endfor %}
校验和表单
validator服务可以被用于任何时候校验任何对象。 事实上,你将经常在处理表单时间接使用validator。Symfony的表单类库间接使用validator服务来在数据被提交和绑定后校验底层对象。对象违反约束信息将被转化到FieldError对象,该对象可以很容易的被展示在你的表单中。在一个controller中的传统表单提交流程如下:
复制代码 代码如下:
use Acme\BlogBundle\Entity\Author;
use Acme\BlogBundle\Form\AuthorType;
use Acme\Component\HttpFoundation\Request;
//...