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;
}
?>
为了使验证函数 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', ...
]
?>
大多数验证有默认的错误信息,在验证失败的时候显示出来.例如 required 验证可以添加一句 "Username cannot be blank." 将会在username 没有填写的时候自动出现,如下:
<?php
public function rules()
{
return [
['username', 'required', 'message' => 'Please choose a username.'],
];
}
?>
当 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 事件.你也可以重写这个方法或响应这个事件在验证完成后做一些处理工作。
为了验证只有当某些条件适用属性, e.g. 一个属性的有效性依赖于另一个属性的值,你可以使用当属性来定义这样的条件。例如,‘state‘ 只有当 ‘model‘的属性值 ‘country‘ 为 ‘USA‘ 才成立
<?php
[
['state', 'required', 'when' => function($model) {
return $model->country == 'USA';
}],
]
?><?php /** * @param Model $model 正在被验证的model * @param string $attribute 正在被验证的属性 * @return boolean 是否这个验证成功了 */ function ($model, $attribute)
[
['state', 'required', 'when' => function ($model) {
return $model->country == 'USA';
}, 'whenClient' => "function (attribute, value) {
return $('#country').val() == 'USA';
}"],
]
用户输入的数据经常要预处理或过滤. 例如, 你可能想去掉username input两端的空格.
你可以使用验证规则去达到这个效果。
下面的例子就是去掉空格inputs 将孔的输入框转换为 nulls通过使用 trim 和 default两个核心验证器:
<?php
[
[['username', 'email'], 'trim'],
[['username', 'email'], 'default'],
]
?>你可以展示更一般的过滤去完成更复杂的数据过滤.
当 HTML forms 表单数据被提交的时候, 你通常需要分配一些默认的值给这些 inputs 如果他们是空的话. 你也可以这么做使用默认的验证 如下代码:
<?php
[
// 设置 "username" 和 "email" 值为 null 如果没填的话
[['username', 'email'], 'default'],
// 设置 "level" 为 1 如果为空的话
['level', 'default', 'value' => 1],
]
?><?php
[
['agree', 'required', 'isEmpty' => function ($value) {
return empty($value);
}],
]
?>
有时候你需要做一个特别验证,对某些没有绑定到任何 model的值
如果你只需要执行一个类型的验证 (e.g. 验证 email 地址), 你可以调用 validate()
方法去找到相应的验证,
就像想下面这样:
<?php
$email = 'test@example.com';
$validator = new yii\validators\EmailValidator();
if ($validator->validate($email, $error)) {
echo 'Email is valid.';
} else {
echo $error;
}
?><?php
public function actionSearch($name, $email)
{
$model = DynamicModel::validateData(compact('name', 'email'), [
[['name', 'email'], 'string', 'max' => 128],
['email', 'email'],
]);
if ($model->hasErrors()) {
// 验证失败代码
} else {
// 验证成功代码
}
}
?><?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 {
// 验证成功代码
}
}
?>
原文:http://blog.csdn.net/wujiangwei567/article/details/46446537