ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 简介 在不同的场景下,模型可能会使用不同的业务规则和逻辑, 例如`email`属性在注册时强制要求有,但在登陆时不需要;也就是说`User`模型可能会在收集用户登录输入, 也可能会在用户注册时使用验证。   场景特性主要在**验证**、**属性块赋值**或者**基于不同的场景定义不同的 属性标签**。 # 使用场景进行验证 ## 定义模型验证规则 文件在`app\models\Users.php`内容如下: ~~~ <?php namespace app\models; use yii\db\ActiveRecord; class Users extends ActiveRecord { const SCENARIO_LOGIN = 'login'; const SCENARIO_REGISTER = 'register'; /** * @return string */ public static function tableName() { return 'users'; } public function rules() { return [ // 在"register" 场景下 username, email 和 password 必须有值 [['username', 'email', 'password'], 'required', 'on' => self::SCENARIO_REGISTER], // 在 "login" 场景下 username 和 password 必须有值 [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN], ]; } } ~~~ ### 在控制器中使用 文件在`app\controllers\UserController.php`内容如下: ~~~ <?php namespace app\controllers; use app\models\Users; use yii\web\Controller; class UserController extends Controller { public function actionLogin() { $model = new Users; $model->scenario = Users::SCENARIO_LOGIN; // 或者通过构造函数配置 $model = new Users(['scenario'=>'login']); if (\Yii::$app->request->isPost) { } return $this->render('login', ['model' => $model]); } public function actionRegister() { $model = new Users(['scenario'=>'register']); if (\Yii::$app->request->isPost) { } return $this->render('login', ['model' => $model]); } } ~~~ # 使用场景进行属性块赋值 使用场景进行属性块赋值只是在赋值给模块的`attributes`属性赋值的时候会根据定义的规则进行赋值。 ## 定义模型场景规则 文件在`app\models\Users.php`内容如下 ~~~ <?php namespace app\models; use yii\db\ActiveRecord; class Users extends ActiveRecord { const SCENARIO_LOGIN = 'login'; const SCENARIO_REGISTER = 'register'; /** * @return string */ public static function tableName() { return 'users'; } /** * @return array */ public function scenarios() { $scenarios = parent::scenarios(); $scenarios[self::SCENARIO_LOGIN] = ['username', 'password']; $scenarios[self::SCENARIO_REGISTER] = ['username', 'email', 'password']; return $scenarios; } } ~~~ ### 控制器代码 ~~~ <?php namespace app\controllers; use app\models\Users; use yii\web\Controller; class UserController extends Controller { public function actionLogin() { $model = new Users; $model->scenario = Users::SCENARIO_LOGIN; // 或者通过构造函数配置 $model = new Users(['scenario'=>'login']); if (\Yii::$app->request->isPost) { $model->attributes = \Yii::$app->request->post('Users'); print_r($model); // 查看model的属性只有"username"和"password"被赋值 } return $this->render('login', ['model' => $model]); } public function actionRegister() { $model = new Users(['scenario'=>'register']); if (\Yii::$app->request->isPost) { $model->attributes = \Yii::$app->request->post('Users'); print_r($model);// 查看model的属性只有"username","email"和"password"被赋值 } return $this->render('login', ['model' => $model]); } } ~~~ # 使用场景定义不同的属性标签 属性标签是 视图一部分,但是在模型中申明标签通常非常方便, 并可形成非常简洁可重用代码。 ## 定义模型规则 文件在`app\models\Users.php`内容如下(主要查看`attributeLabels()`方法) ~~~ <?php namespace app\models; use yii\db\ActiveRecord; class Users extends ActiveRecord { const SCENARIO_LOGIN = 'login'; const SCENARIO_REGISTER = 'register'; /** * @return string */ public static function tableName() { return 'users'; } /** * @return array */ public function attributeLabels() { if ($this->scenario == self::SCENARIO_LOGIN) { $typeString = '登录'; $userName = $typeString . '用户名'; $email = $typeString . '邮箱'; $password = $typeString . '密码'; } else { $typeString = '注册'; $userName = $typeString . '名'; $email = $typeString . '邮箱'; $password = $typeString . '密码'; } return [ 'username' => $userName, 'email' => $email, 'password' => $password, ]; } } ~~~ ## 控制器使用`render()`方法渲染模板文件 ~~~ <?php namespace app\controllers; use yii\web\Controller; class UserController extends Controller { public function actionLogin() { return $this->render('login', ['model' => $model]); } public function actionRegister() { return $this->render('login', ['model' => $model]); } } ~~~