限时 5折! 详情

yii2场景的使用

博主推荐:yii2实战式教程是一套简单易学、幽默风趣、干货多多、众人大赞的高质量教程,囊括 yii2基础入门、yii2高级进阶的很多知识点,可以说是迄今最好的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场景生效了!

42b94d9ed7-.png

学习在于活学活用,举一反三,我的方法是死的,忌生搬硬套。文章看懂,自己手动实现一个场景可好?

作者 白狼
本文版权归作者,欢迎转载,但未经作者同意必须保留 此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。