Symfony数据校验方法实例分析(2)

{# src/Acme/BlogBundle/Resources/views/Author/validate.html.twig #}
<h3>The author has the following errros</h3>
<ul>
{% for error in errors %}
    <li>{{ error.message }}</li>
{% endfor %}
</ul>

校验和表单

validator服务可以被用于任何时候校验任何对象。 事实上,你将经常在处理表单时间接使用validator。Symfony的表单类库间接使用validator服务来在数据被提交和绑定后校验底层对象。对象违反约束信息将被转化到FieldError对象,该对象可以很容易的被展示在你的表单中。在一个controller中的传统表单提交流程如下:

复制代码 代码如下:

use Acme\BlogBundle\Entity\Author;
use Acme\BlogBundle\Form\AuthorType;
use Acme\Component\HttpFoundation\Request;
//...

public function updateAction(Request $request)
{
    $author = new Acme\BlogBundle\Entity\Author();
    $form = $this->createForm(new AuthorType(),$author);

if($request->getMethod() =='POST'){
       $form->bindRequest($request);
 
       if($form->isvalid()){
          //对$author做一些操作
          return $this->redirect($this->generateUrl('...'));
       }
     }

return $this->render('BlogBundle:Author:form.html.twig',array(
         'form' => $form->createView(),
     ));
}

配置:

Symfony2 的validator默认情况下是可用的。但是如果你使用了生命方法来指定你的约束,那么你需要显式的开启声明功能:

YAML格式:

复制代码 代码如下:

# app/config/config.yml
framework:
   validation: {enable_annotations: true }


XML格式:

复制代码 代码如下:

<!-- app/config/config.xml -->
<framework:config>
   <framework:validation enable-annotations="true" />
</framework:config>


PHP代码格式:

复制代码 代码如下:

// app/config/config.php
$contianer->loadFromExtension('framework',array('validation'=> array(
     'enable_annotations'=>true,
)));

约束规则

Validator是设计了用来按照约束规则校验对象的。为了校验一个对象,只需要映射一个或者多个约束到它要校验的类然后把它传递给validator服务即可。

本质上,一个约束就是一个简单的PHP对象,它可以生成一个决断语句。 在现实生活中,一个约束可以是"蛋糕不能烤焦了" 这样的规则约束。在Symfony2中,约束都差不多:他们决断某个条件是否成立。给定一个值,约束会告诉你这个值是否遵守了你的约束规则。

Symfony2 支持的约束规则

首先是基础约束规则:使用他们来决断非常基本的事,比如你对象属性的值或者方法的返回值。

NotBlank,Blank,NotNull,Null,True,False,Type

  字符串约束:Email,MinLength,MaxLength,Url,Regex,Ip等
  数字约束:Max,Min
  日期约束:Date,DateTime和Time
  集合约束:Choice,Collection,UniqueEntity,Language,Locale和Country等。
  文件约束:File,Image
  其它约束:Callback,All,Valid

你也可以创建自己的自定义约束。

约束配置:

一些约束,比如NotBlank,很简单,但是其它的比如Choice约束,有许多配置项需要设置。假设Author类有另外一个属性,gener可以被设置为”male"或者"female":

YAML格式:

复制代码 代码如下:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
    properties:
         gener:
            - Choice: { choices: [male, female], message: Choos a valid gender. }


类声明格式:

复制代码 代码如下:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8cc28a531e1f69845a26ca55b26ed69c.html