yii2场景的使用
场景,顾名思义,就是一个情景,一种场面。在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场景生效了!
学习在于活学活用,举一反三,我的方法是死的,忌生搬硬套。文章看懂,自己手动实现一个场景可好?