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'=>'电子邮件格式不正确'],
        ];
    }
}

可以看到如下表现

都不输入

邮件格式错误

输入都正确

很容易和我们修改后的代码对应。

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, '必须为 "呵呵" 或 "嘿嘿" 中的一个。');
        }
    }
}

没有提到的还有客户端验证和独立验证器

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

时间: 2024-08-25 16:21:53

Yii Framework2.0开发教程(8)输入验证的相关文章

Yii Framework2.0开发教程(5)数据库mysql性能

继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给予一定的尊重yii2数据库支持引进 Yii 基于 PHP's PDO一个成熟的数据库访问层的建立.它提供了一个统一的 API 并且克服了许多不同的 DBMS 违禁使用. Yii 默认支持下面 DBMS : MySQL MariaDB SQLite PostgreSQL CUBRID: version 9.1.0 or higher. Oracle MSSQL: version 2012 或更高版本号,如需使用 L

Yii Framework2.0开发教程(5)数据库mysql函数

继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给一些关于yii2数据库支持的介绍 Yii 基于 PHP's PDO建立了一个成熟的数据库访问层.它提供统一的 API 并解决了一些不同 DBMS 产生的使用不利. Yii 默认支持以下 DBMS : MySQL MariaDB SQLite PostgreSQL CUBRID: version 9.1.0 or higher. Oracle MSSQL: version 2012 或更高版本,如需使用 LIMIT

Yii Framework2.0开发教程(7)账户注册开发

注册的过程:用户输入数据->提交服务器->插入数据库 由于AR继承自[[yii\base\Model]],所以它同样也支持Model的数据输入.验证等特性.例如,你可以声明一个rules方法用来覆盖掉[[yii\base\Model::rules()|rules()]]里的:你也可以给AR实例批量赋值:你也可以通过调用[[yii\base\Model::validate()|validate()]]执行数据验证. 当你调用 save().insert().update() 这三个方法时,会自动

Yii Framework2.0开发教程(3)数据库mysql入门

沿用教程(2)的代码 第一步.在本地mysql数据库中新建数据库zhyoulun 第二步.在数据库中新建表并插入若干条数据 CREATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country

Yii Framework2.0开发教程(4)在yii中定义全局变量

在yii中定义全局变量最好的地方是入口脚本处.也就是web文件夹中的index.php文件 例如我们在defined('YII_ENV') or define('YII_ENV', 'dev');后写上 defined('ZYL_HEHE') or define('ZYL_HEHE','zhyoulun-hehe'); 并在我们教程(1)中建立的views/zhyoulun/helloworld.php文件中写上 <?php echo 'hello world!'; //全局变量 echo co

Yii Framework2.0开发教程(6)数据库mysql--ActiveRecord

Active Record(活动记录,以下简称AR)提供了一个面向对象的接口,用以访问数据库中的数据. 一个AR 类关联一张数据表,每个 AR 对象对应表中的一行,对象的属性(即 AR 的特性Attribute)映射到数据行的对应列. 一条活动记录(AR对象)对应数据表的一行,AR对象的属性则映射该行的相应列. 您可以直接以面向对象的方式来操纵数据表中的数据,妈妈再不用担心我需要写原生 SQL 语句啦. 编辑models/Country.php <?php namespace app\model

Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录

1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment comment 'ID', user_email varchar(100) not null comment '电子邮件', user_password varchar(100) not null comment '密码', user_access_token varchar(200) comment

Yii 2.0开发一个仿京东商城平台

课程目录及下载地址: 第1章 课程简介介绍了课程内容.背景和案例展示.第2章 项目的准备工作介绍了如何使用PHP依赖管理工具Composer安装Yii2框架,模拟配置真实企业开发项目运行环境和编辑器.第3章 项目前台页面的搭建介绍了如何使用Yii2框架的页面布局管理完成前台首页.商品分类.商品详情.购物车.收银台.订单中心.用户注册登录页面的搭建和渲染.第4章 项目后台页面的搭建介绍了如何使用Yii2框架的脚手架Gii模块创建后台功能模块,完成后台页面的搭建及前后台页面的调优处理.第5章 管理员

100套最适合自学的实战开发教程视频(程序员都在学)

BAT大咖助力 全面升级Android面试 BAT大牛亲授 基于ElasticSearch的搜房网实战 从天气项目看Spring Cloud微服务治理 Java企业级电商项目架构演进之路  Tomcat集群与Redis分布式 Java深入微服务原理改造房产销售平台 SSM到Spring Boot-从零开发校园商铺平台 Java Spring Boot企业微信点餐系统 Java秒杀系统方案优化-高性能高并发实战 Spring Boot技术栈博客企业前后端 Java SSM快速开发仿慕课网在线教育平