Yii学习笔记之四(表单验证 api 翻译)

1.表单验证

对于用户输入的所有数据,你不能信任,必须加以验证。

所有框架如此,对于yii 可以使用函数

yii\base\Model::validate()  进行验证

他会返回boolean值的 true /false

如果验证未通过,可以使用

yii\base\Model::$errors 属性进行处理,如下代码:

<?php

 //加载表单模型(绝对地址方式)
 /*如果上面引入
   use app\models\ContactForm;
   则可以直接使用
   $model = new ContactForm;
 */
 $model = new \app\models\ContactForm;

// 接收用户填充的模型的字段 翻入属性
$model->attributes = \Yii::$app->request->post('ContactForm');

if ($model->validate()) {
    // 所有的输入验证通过
} else {
    // 验证失败: $errors 是一个包含所有错误信息的数组
    $errors = $model->errors;
}

?>

2. 声明规则

为了使验证函数 validate() 真正起作用,我们需要定一些验证

规则对应这些表单进行对应的验证,他会自动重写

yii\base\Model::rules() 方法

下面的例子讲述如何使用 rules

<?php

public function rules()
{
    return [
        // name, email, subject 和 body 属性必须填写
        [['name', 'email', 'subject', 'body'], 'required'],

        //email 必须是一个有效的邮箱地址
        ['email', 'email'],
    ];
}

//rule 返回值的格式

[
    // 必须的参数一, 指定必须遵守这个规则的某个属性或某些属性.
    // 对一个单个的属性,你能直接使用属性名
    // 不必将他放进一个数组
    ['attribute1', 'attribute2', ...], //对于多个则可以放进一个数组

    // 必须的参数二, 指定规则的类型.
    // 他可以是一个类名, 验证方法的别名, 或者是验证方法名
    'validator',

    // 可选的参数三, 指定那一个场景使用这个规则
    // 如果没给, 意味着这个规则所有的场景都要将适用
    // 你可能也要配置 "except" 规则如果你想使用这个规则
    // to all scenarios except the listed ones
    'on' => ['scenario1', 'scenario2', ...],

    // 可选的参数, 定制额外的配置对验证项目
    'property1' => 'value1', 'property2' => 'value2', ...
]

?>

1> 对于每一个规则,你必须至少指定哪些属性的规则适用于什么是规则的类型。您可以在下列形式之一指定的规则类型:

(1) 核心验证的别名, 比如 required, in, date, 等等. 请参阅核心验证器为核心的校验器的完整列表。

http://www.yiiframework.com/doc-2.0/guide-tutorial-core-validators.html

(2) 在模型类model class中的验证方法的名字, 或一个匿名函数. 请参考内联验证器的详细信息.

http://www.yiiframework.com/doc-2.0/guide-input-validation.html#inline-validators

(3) 一个完全合格的验证器类名. 请参考标准验证器

http://www.yiiframework.com/doc-2.0/guide-input-validation.html#standalone-validators

一个规则可以用于一个或多个属性验证, 一个属性可以被一个或多个规则验证. 规则可以在某些情况下

只能通过选项指定的应用。如果您不选择指定,这意味着该规则将适用于所有情况。

2> 当 validate() 方法被调用的时候, 下面的步骤来解释验证的过程:

(1) 首先确定哪些属性应该通过获得从属性列表中进行验证

yii\base\Model::scenarios() 使用当前的场景.这些属性被称为活跃属性。

(2) 确定哪些验证规则将会被使用通过获取 rule 列表从

yii\base\Model::rules() 在当前的场景中使用. 这些规则被称为活跃规则。

(3) 用一个活跃的规则去验证每一个活跃的与对应规则相关联的属性.

这些验证规则将根据他们列出的顺序顺序执行。

3. 定制错误信息

大多数验证有默认的错误信息,在验证失败的时候显示出来.例如 required 验证可以添加一句 "Username cannot be blank." 将会在username 没有填写的时候自动出现,如下:

<?php
public function rules()
{
    return [
        ['username', 'required', 'message' => 'Please choose a username.'],
    ];
}

?>

有些可能验证支持附加的额外的错误消息,以更准确地描述验证失败不同的原因。例如,数字验证器支持tooBig和tooSmall来描述验证失败时要验证的值分别为过大,过小。您可以配置这些错误信息就像一个验证规则配置验证的其他属性一样。

4. 验证事件

当 yii\base\Model::validate() 被调用的时候, 它将会自动调用两个自定义的方法:

http://www.yiiframework.com/doc-2.0/yii-base-model.html#beforeValidate()-detail

(1) yii\base\Model::beforeValidate(): 默认的实现会自动触发一个 yii\base\Model::EVENT_BEFORE_VALIDATE 事件. 你也可以重写这个方法或响应这个事件做一些预处理工作 (e.g. 正常化的数据输入) 在验证事件发生之前. 这个方法应该返回一个布尔值,指示验证是否应该继续与否。

(2) yii\base\Model::afterValidate(): 默认的实现会自动触发一个yii\base\Model::EVENT_AFTER_VALIDATE  事件.你也可以重写这个方法或响应这个事件在验证完成后做一些处理工作。

5. 条件验证

为了验证只有当某些条件适用属性, e.g. 一个属性的有效性依赖于另一个属性的值,你可以使用当属性来定义这样的条件。例如,‘state‘ 只有当 ‘model‘的属性值 ‘country‘ 为 ‘USA‘ 才成立

<?php
[
    ['state', 'required', 'when' => function($model) {
        return $model->country == 'USA';
    }],
]

?>

这个 when 属性携带了一个PHP调用带着下面的签名:

<?php
/**
 * @param Model $model 正在被验证的model
 * @param string $attribute 正在被验证的属性
 * @return boolean 是否这个验证成功了
 */
function ($model, $attribute)

如果你也想支持客户端条件验证,你应该配置这个 whenClient 属性,以一个字符串形式传递

JavaScript 函数代码返回这个规则是否正确. 例如,

[
    ['state', 'required', 'when' => function ($model) {
        return $model->country == 'USA';
    }, 'whenClient' => "function (attribute, value) {
        return $('#country').val() == 'USA';
    }"],
]

6. 数据过滤

用户输入的数据经常要预处理或过滤. 例如, 你可能想去掉username input两端的空格.

你可以使用验证规则去达到这个效果。

下面的例子就是去掉空格inputs 将孔的输入框转换为 nulls通过使用 trim 和 default两个核心验证器:

<?php
[
    [['username', 'email'], 'trim'],
    [['username', 'email'], 'default'],
]
?>

你可以展示更一般的过滤去完成更复杂的数据过滤.

就像你看到的,这些验证并不验证输入.相反,他们将输入通过程序返回给验证器.

7. 处理空的输入

当 HTML forms 表单数据被提交的时候, 你通常需要分配一些默认的值给这些 inputs 如果他们是空的话. 你也可以这么做使用默认的验证 如下代码:

<?php
[
    // 设置 "username" 和 "email" 值为 null 如果没填的话
    [['username', 'email'], 'default'],

    // 设置 "level" 为 1 如果为空的话
    ['level', 'default', 'value' => 1],
]
?>

对于默认验证, 一个 input会被考虑是空的 如果他的值是一个空的字符串, 一个空的数组array 或者是一个 null. 你可以自定义这个默认值的逻辑通过配置

yii\validators\Validator::isEmpty() 属性作为一个 PHP调用. 例如:

<?php
[
    ['agree', 'required', 'isEmpty' => function ($value) {
        return empty($value);
    }],
]
?>

提示: 大多数验证不会处理空的 inputs 如果他们的

yii\base\Validator::skipOnEmpty 属性带着默认的 true 值. 仅仅是captcha, default, filter, required,
和 trim 验证器会处理空的 inputs.

8. 特设验证

有时候你需要做一个特别验证,对某些没有绑定到任何 model的值

如果你只需要执行一个类型的验证 (e.g. 验证 email 地址), 你可以调用 validate()
方法去找到相应的验证,

就像想下面这样:

<?php
$email = '[email protected]';
$validator = new yii\validators\EmailValidator();

if ($validator->validate($email, $error)) {
    echo 'Email is valid.';
} else {
    echo $error;
}

?>

提示: 并不是所有的验证器都支持这种类型验证. 一个例子是独特的核心验证,其目的是只用模式来工作。

如果需要对多个值执行多个验证,您可以使用

yii\base\DynamicModel 可以同时声明属性 和 规则. 使用方式如下:

<?php

public function actionSearch($name, $email)
{
    $model = DynamicModel::validateData(compact('name', 'email'), [
        [['name', 'email'], 'string', 'max' => 128],
        ['email', 'email'],
    ]);

    if ($model->hasErrors()) {
        // 验证失败代码
    } else {
        // 验证成功代码
    }
}

?>

这个

yii\base\DynamicModel::validateData()

方法创建了一个 DynamicModel 的实例,定义了使用给定的数据的属性(name 和 email 在这个例子中),

而且之后调用 yii\base\Model::validate() 携带给定的规则.

或者你可以使用  "classic" 语法进行上面的验证:

<?php
public function actionSearch($name, $email)
{
    $model = new DynamicModel(compact('name', 'email'));
    $model->addRule(['name', 'email'], 'string', ['max' => 128])
        ->addRule('email', 'email')
        ->validate();

    if ($model->hasErrors()) {
        // 验证失败代码
    } else {
        // 验证成功代码
    }
}

?>
时间: 2024-08-03 06:58:07

Yii学习笔记之四(表单验证 api 翻译)的相关文章

AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)

这一节相对来说需要理解的东西不是太多,记住了那些api就行了. 还是一个案例(同样来自miaov),一个表单验证,先上代码,然后再对对应的内容进行解释. <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8"> <title>Title</title> </head>

[学习笔记]--Jfinal 表单提交附件

最近,项目里面用到了Jfinal 里面的上传附件.Jfinal 的Controller 里面提供了一个 getFile系列方法提供文件上传. 我这里呢,是文件上传和表单参数一起提交.页面类似下图: 这里form表单里面使用了 enctype="multipart/form-data" .先看看Jfinal手册的说明吧!大家看了就知道了 然后还有个问题 如果是表单提交 还不可以用ajax 提交,具体的原因呢也找到了 http://www.oschina.net/question/9410

Symfony2学习笔记之表单

对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将从基础开始创建一个复杂的表单,学习表单类库中最重要的内容. Symfony2 的Form组件是一个独立的类库,你可以在Symfony2项目之外使用它. 创建一个简单的表单:假设你要创建一个应用程序的todo列表,需要显示一些任务.因为你的用户需要编辑和创建任务,所以你需要创建一个表单.在你开始之前,首先来看通用的Task类,用来表示和存储一个单

Codeigniter入门学习笔记14—表单的验证

很久很久以前学习Codeigniter的笔记记录,很随意,但都是自己记录的,希望对需要的人有所帮助. 本文使用word2013编辑并发布 Postbird | There I am , in the world more exciting! Postbird personal website : http://www.ptbird.cn 表单验证 1.add_user ????] 2.form_check() ???? 3. ? 1.加载 ????$this->load->library('f

Bootstrap学习笔记(二) 表单

在Bootstrap学习笔记(一) 排版的基础上继续学习Bootstrap的表单,编辑器及head内代码不变. 3-1 基础表单 单中常见的元素主要包括:文本输入框.下拉选择框.单选按钮.复选按钮.文本域和按钮等. 在Bootstrap框架中,通过定制了一个类名`form-control`,也就是说,如果这几个元素使用了类名"form-control",将会实现一些设计上的定制效果. 1.宽度变成了100% 2.设置了一个浅灰色(#ccc)的边框 3.具有4px的圆角 4.设置阴影效果

Bootstrap 学习笔记 之表单(4 day)

Bootstrap学习到这里,理解了为什么它是一个框架,所谓的框架,目前看来就是它本身提供了一套完整的HTML结构和样式. 我们在使用的时候,只要按照这套规则来搭建HTML结构和加上相应的样式名后就可以了. 今天学习的是表单, Bootstrap 提供了下列类型的表单布局: 垂直表单(默认) 内联表单 水平表单 需要一提的就是表单的状态: 表单控件状态 除了 :focus 状态(即,用户点击 input 或使用 tab 键聚焦到 input 上),Bootstrap 还为禁用的输入框定义了样式,

flask学习笔记之--表单控件

表单验证 Flask-WTF 从 version 0.9.0有了变化,正确要引用wtforms包 正确的写法: from flask.ext.wtf import Form from wtforms import TextField, BooleanField from wtforms.validators import Required

Bootstrap学习笔记(四)表单input

单行输入框,常见的文本输入框,也就是input的type属性值为text.在Bootstrap中使用input时也必须添加type类型,如果没有指定type类型,将无法得到正确的样式,因为Bootstrap框架都是通过input[type="?"](其中?号代表type类型,比如说text类型,对应的是input[type="text"])的形式来定义样式的. <form role="form"> <div class=&quo

Yii学习笔记之五(核心验证器 api 翻译)

核心验证器 Core Validators 0. 前言 Yii 提供了一系列常用的核心 validators, 你可在 yii\validators namespace 中找到. 不用使用长的验证器类名, 你可以使用别名代替他们. 例如, 你可以使用别名 required 代替 yii\validators\RequiredValidator 类: <?php public function rules() { return [ [['email', 'password'], 'required