首页 > 代码库 > Yii Framework2.0开发教程(8)输入验证

Yii Framework2.0开发教程(8)输入验证

validate() 方法。在幕后为运行验证操作。先看一个简单的样例。样例的代码在《Yii Framework2.0开发教程(2)使用表单Form》。

类ZhyoulunController中函数actionEntry() ,当中有一句$model->validate()。就是来推断输入的名字和电子邮件是否正确。

改动models/EntryForm.php

<?php
 
namespace app\models;
 
use yii\base\Model;
 
class EntryForm extends Model
{
    public $name;
    public $email;
 
    public function rules()
    {
        return [
            [‘name‘, ‘required‘,‘message‘=>‘名称不可缺省‘],
            [‘email‘, ‘required‘,‘message‘=>‘邮件不能缺省‘],
						[‘email‘, ‘email‘,‘message‘=>‘电子邮件格式不对‘],
        ];
    }
}

能够看到例如以下表现

都不输入

技术分享

邮件格式错误

技术分享

输入都正确

技术分享

非常easy和我们改动后的代码相应。


validate() 方法,在幕后为运行验证操作。进行了下面步骤:

1、通过从 [[yii\base\Model::scenarios()]] 方法返回基于当前 [[yii\base\Model::scenario|场景(scenario)]] 的特性属性列表算出哪些特性应该进行有效性验证

这些属性被称作active attributes(激活特性)

2、通过从 [[yii\base\Model::rules()]] 方法返回基于当前 [[yii\base\Model::scenario|场景(scenario)]] 的验证规则列表,这些规则被称作active rules(激活规则)

3、用每一个激活规则去验证每一个与之关联的激活特性。若失败,则记录下相应模型特性的错误信息。


rules()函数的语法

[
    // 必须项。用于指定那些模型特性须要通过此规则的验证。
    // 对于仅仅有一个特性的情况。能够直接写特性名。而不必用数组包裹。

[‘attribute1‘, ‘attribute2‘, ...], // 必填项,用于指定【规则的类型】。 // 它能够是类名,验证器昵称,或者是验证方法的名称。

‘validator‘, // 可选项,用于指定在场景(scenario)中,须要启用该规则 // 若不提供,则代表该规则适用于全部场景 // 若你须要提供除了某些特定场景以外的全部其它场景,你也能够配置 "except" 选项 ‘on‘ => [‘scenario1‘, ‘scenario2‘, ...], // 可选项。用于指定对该验证器对象的其它配置选项 ‘property1‘ => ‘value1‘, ‘property2‘ => ‘value2‘, ... ]


你能够指定下面的规则类型之中的一个:

核心验证器的昵称,比方 required、in、date。等等。请參考【核心验证器章节】查看完整的核心验证器列表。

模型类中的某个验证方法的名称。或者一个匿名方法。请參考【行内验证器小节】了解很多其它。

验证器类的名称。

请參考【独立验证器小节】了解很多其它。


一个规则可用于验证一个或多个模型特性。且一个特性能够被一个或多个规则所验证。


核心验证器https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/tutorial-core-validators.md

default

						[‘age‘, ‘default‘, ‘value‘ => null],// 若 "age" 为空。则将其设为 null
						[‘country‘, ‘default‘, ‘value‘ => ‘USA‘],// 若 "country" 为空,则将其设为 "USA"
						// 若 "from" 和 "to" 为空,则分别给他们分配自今天起,3 天后和 6 天后的日期。

[[‘from‘, ‘to‘], ‘default‘, ‘value‘ => function ($model, $attribute) { return date(‘Y-m-d‘, strtotime($attribute === ‘to‘ ? ‘+3 days‘ :‘+6 days‘)); }],


trim

[‘name‘,‘trim‘],//去掉输入信息的首尾空格


行内验证器

1、以匿名函数形式定义的行内验证器

[‘name‘, 
							function($attribute, $params) 
							{
                if (!ctype_alnum($this->$attribute)) 
								{
                    $this->addError($attribute, ‘令牌本身必须包括字母或数字。

‘); } } ],


技术分享


2、以模型方法 validateCountry() 形式定义的行内验证器

<?

php namespace app\models; use yii\base\Model; class EntryForm extends Model { public $name; public $email; public function rules() { return [ [‘name‘, ‘required‘,‘message‘=>‘名称不可缺省‘], [‘email‘, ‘required‘,‘message‘=>‘邮件不能缺省‘], [‘email‘, ‘email‘,‘message‘=>‘电子邮件格式不对‘], // [‘name‘, // function($attribute, $params) // { // if (!ctype_alnum($this->$attribute)) // { // $this->addError($attribute, ‘令牌本身必须包括字母或数字。‘); // } // } // ], [‘name‘, ‘validateCountry‘], ]; } public function validateCountry($attribute, $params) { if (!in_array($this->$attribute, [‘呵呵‘, ‘嘿嘿‘])) { $this->addError($attribute, ‘必须为 "呵呵" 或 "嘿嘿" 中的一个。‘); } } }


技术分享


没有提到的还有client验证和独立验证器

https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/input-validation.md#%E7%8B%AC%E7%AB%8B%E9%AA%8C%E8%AF%81%E5%99%A8standalone-validators-

https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/input-validation.md#%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%AA%8C%E8%AF%81%E5%99%A8client-side-validation-


參考:https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/input-validation.md


转载请注明出处:http://blog.csdn.net/zhyoulun/article/details/40476805

Yii Framework2.0开发教程(8)输入验证