场景是一个分离所有CModel派生类验证任务的非常有用的工具,在这里我们将使用 CActiveRecord。
指定场景
首先要做的是初始化一个带有场景的模型(Model).我们有两种方法来实现它。
1. 新的 CActiveRecord 使用构造函数的参数方式
1
|
$model
=
new
MyActiveRecord(
'formSubmit'
);
|
在例子中 MyActiveRecord 继承 CactiveRecord ,'fromSumbit' 是一个验证场景。
2. 已经存在的 CActiveRecord
1
2
|
$model
= MyActiveRecord::model()->find(
'id = :id'
,
array
(
':id'
=> 1);
$model
->scenario =
'formSubmit'
;
|
这个例子是我们将现有的模型切换到一个场景。
创建场景的具体验证规则
首先需要注意的时所有未被指定场景的验证规则将会使用到所有场景中。这将会对创建一系列不使用继承的验证规则时非常有用。当在模型中设置了验证规则的属性表示它们时安全的(safe),除非它们在 'unsafe' 规则中被指定。 进一步了解:
Reference: Model rules validation
Understanding "Safe" Validation Rules
场景验证规则的例子:
1
2
3
4
5
6
7
8
9
|
public
function
rules() {
return
array
(
array
(
'name'
,
'required'
),
array
(
'name'
,
'match'
,
'not'
=> true,
'pattern'
=>
'/[^a-zA-Z0-9 ]/'
,
'message'
=>
'name 必须由字母、数字或空格组成'
,
'on'
=>
'formSubmit'
),
);
}
|
注意将规则指定到场景使用 ‘on’,就像例子中的一样,如果没有指定场景只有规则 name 不能为空起作用,如果设置了场景 'fromSubmit' 则两个规则都将起作用。 其他例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
$model
->scenario =
'formSubmit'
;
$model
->name =
'Joe Blogs'
;
if
(
$model
->validate()) {
//通过所有验证
}
$model
->scenario =
'formSubmit'
;
$model
->name =
'Joe Blogs - is awesome!!!!'
;
if
(
$model
->validate()) {
//不通过场景 ‘fromSumbit’ 的验证
}
$model
->scenario = null;
$model
->name =
'Joe Blogs - is awesome!!!!'
;
if
(
$model
->validate()) {
//通过验证,没有指定场景所以不会验证指定场景的验证规则
}
$model
->scenario =
'formSubmit'
;
$model
->name = null;
if
(
$model
->validate()) {
//不通过验证,原因是没有通过未指定场景的验证规则
}
|
小结
现在你可以对用户的输入进行层叠验证或独立验证。这样就可以在业务逻辑上给用户更加严格的规则。