Yii2-validate

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

message 可以自定义验证错误消息。

//const SCENARIO_CREATE = 'add';
//const SCENARIO_UPDATE = 'update';

public function rules()
{
   return [
        [['age'], 'integer'],
        [['name'], 'string', 'max' => 22],
        ['name','required','message'=>'姓名不能为空','on'=>['add','update']],
        ['age','required','message'=>'年龄不能为空','on'=>'add'],
        ['age','isMath','on'=>'add']     
   ];
}

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios['add'] = ['age','name'];
    $scenarios['update'] = ['age','name'];
    return $scenarios;
}

默认情况下,scenarios() 返回的是一个关系数组,键是模型中所有可用的场景,值是场景对应的 active attributes 列表。active attributes 有两个特点:

  1. 调用 validate() 时仅会验证 active attributes
  2. 使用 $model->load() && $model->save() 保存数据时也只会保存 active attributes

默认的 scenarios() 过程(以例子中声明的规则为例)。scenarios() 会进行两次遍历操作。首先遍历 rules 中声明的规则,把所有可用的场景找出来,并初始化数组,以你的例子中的 rules 为例,值为:

[
    'default' => [], // 框架自带的默认场景
    'add' => [],
    'update' => [],
]

第二次遍历时,对每个 rule 中声明的 attributes “对号入座”,如果 rule 中不带 'on' 属性,表示该属性所属的规则适用于所有场景(例如 [['age'], 'integer']), 会将 'age' 追加到所有场景的 active attibutes 列表中;如果指定了场景值,仅在对应的场景下的active attributes 内追加。

经过这两次遍历,scenarios() 最终返回的值将是:

[
    'default' => ['age', 'name'], 
    'add' => ['age', 'name'],
    'update' => ['age', 'name'],
]

了解了这个过程,我的理解是:在大多数情况下,是不需要重写 scenarios() 的,通过配置 rules() 来改变 scenarios() 的返回值,而不是直接手动覆盖 sceanrios(). 覆盖带来的一个明显的弊端是:你的精力被分散到了两个方法内(rules() 和 scenarios()),假设将来你的 info 表又新增了一列,在 rules() 追加新的规则的同时,你还要修改重写后的 scenarios(), 把新增加的列追加进去使其成为 active attribute,否则就会出现新增列的数据无法存入数据库。使用默认的 scenarios() 的话,只需要将精力放在 rules() 上即可。

第二个问题

post 表里面有title image content 三个的字段,当我创建一个 post的时候,我想三个字段全部是必填项,但是,你修改的时候,title content 两个字段是必填的, iamge 可以不填写。

  • 创建时:[['title', 'content', 'image'], 'required',]
  • 更改时:[['title', 'content'],'required'] 就可以了,但是少了 image 字段 我们的表单就无法提交,这种问题怎么办啊??场景可以帮你解决这种问题,下面是一个简单的场景实例。

1、首先我们在 model 里面定义一下场景 类名必须是 scenarios()

public functionscenarios()
{
  return [
     'create' => ['title', 'image','content'],
     'update' => ['title','content'],
  ];
}

2、好的,如上所示,场景的基本设置我们就已经完成一部分了,下面我们设置 rules() ,调用场景我们用 on 关键字

 [['title', 'content'], 'required', 'on'=> ['create', 'update']],
 [['image'], 'required', 'on' =>'create'],
 [['image'], 'image', 'enableClientValidation' => true, 'maxSize'=> 1024, 'message' => '文件过大', 'on' => ['create','update']],

on 指定的就是场景,一个场景用字符串,多个场景用数组

3、好的,model 里面我们就设置完毕了 现在开始调用吧 Controller 里面

$model =$this->findModel($id);
$model->setScenario('update'); // 或者 $model->scenario = 'update';  都可以

上面的意思就是调用 update 场景。

转载自 yii2 scenarios()如何理解??

2 验证实践

2.1 验证必填项

public function rules()
{
   return [
        [['username', 'password'],'required'],
   ];
}

2.2 处理空输入

public function rules()
{
   return [
        ['nickname','default', 'value' => '随机昵称'],
   ];
}

2.3 过滤输入

public function rules(){
	return [				
		[['filter_trim'],'filter','filter'=>'trim'],
		[['filter_trim'],'filter','filter'=>'strtolower'],
		['filter_custom_function', 'filter', 'filter' => function ($value) {
			// your concept
			if($value=='')
				return '';
			return 'Value Changed';
		}],
	];
}

2.4 验证字段类型

public function rules(){
	return [
		[['boolean_var'],'boolean'],
		[['number_min'],'number'],
		[['integer_var'],'integer'],
		[['double_var'],'double'],
		[['string_var'],'string'],
        ['file_image', 'file', 'extensions' => ['png', 'jpg', 'gif'], 
				'maxSize' => 1024*1024],
        ['email_var','email'],
        ['url_var','url'],
        [['date_var'],'date', 'format'=>'d-m-yy'],
		[['from_date', 'to_date'], 'default', 'value' => null],
		[['from_date', 'to_date'], 'date'],
	];
}

2.5 自定义验证