场景,顾名思义,就是一个情景,一种场面。在yii2中也有场景,这个场景跟你所理解的场景含义差不多。yii2中的场景有什么用,什么时候我们要去用这个场景呢?
在yii2中,场景主要用于模型不同字段的验证和一堆字段的赋值。例如用户登录时需要对用户名和密码进行校验,注册时除了用户名和密码,我们还需要校验重复密码。在不使用场景的情况下,一般需要一个LoginForm和一个SignupForm,然后写两套验证规则。利用场景,我们只需要创建一个UserForm即可。光说不练基本没用,下面我们就以刚才这个例子来看看场景是怎么使用的!
1、先创建一张简单的用户表
CREATE TABLE `user_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(32) NOT NULL DEFAULT '',
`password` varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、通过gii把模板以及model生成好,model的路径我们选择common\models
3、创建frontend\models\UserForm.php ,定义一些属性 and 对这些属性添加校验规则
public $loginEmail;
public $signupEmail;
public $password;
public $repassword;
public function rules()
{
return [
['loginEmail', 'filter', 'filter' => 'trim'],
['loginEmail', 'required'],
['loginEmail', 'email'],
['loginEmail', 'string', 'max' => 255],
['loginEmail', 'exist', 'targetClass' => '\common\models\UserTest', 'message' => '邮箱不存在.'],
['signupEmail', 'filter', 'filter' => 'trim'],
['signupEmail', 'required'],
['signupEmail', 'email'],
['signupEmail', 'string', 'max' => 255],
['signupEmail', 'unique', 'targetClass' => '\common\models\UserTest', 'message' => '邮箱已注册.'],
['password', 'required'],
['password', 'string', 'min' => 6],
['repassword', 'required'],
['repassword', 'string', 'min' => 6],
['repassword', 'compare', 'compareAttribute' => 'password'],
];
}
4、为UserForm定义场景
const SCENARIO_LOGIN = 'login';
const SCENARIO_REGISTER = 'register';
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_LOGIN] = ['loginEmail', 'password'];
$scenarios[self::SCENARIO_REGISTER] = ['signupEmail', 'password', 'repassword'];
return $scenarios;
}
5、控制器层实例化UserForm后设置场景
$model = new UserForm();
$model->setScenario(UserForm::SCENARIO_REGISTER);
if ($model->load(Yii::$app->request->post())) {
// ......
}
return $this->render('register', [
'model' => $model,
]);
6、我们把UserForm的字段全部展示在一个视图文件内,对比下校验提示
<div class="row">
<div class="col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>
<?= $form->field($model, 'signupEmail') ?>
<?= $form->field($model, 'loginEmail') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'repassword')->passwordInput() ?>
<div class="form-group">
<?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
在表单什么都不填写的情况下,提交表单,发现除了 loginEmail外 其他字段都做了校验提示。也就是说UserForm设置的register场景生效了!
学习在于活学活用,举一反三,我的方法是死的,忌生搬硬套!文章看懂,自己手动实现一个场景可好?
原文出处:白狼栈,专注于yii2实战性项目开发!
热门评论
谢谢,您的分享~