[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]);
}
}
~~~
- 目录
- 配置
- 简介
- 别名
- gii
- 配置项
- 模型
- 简介
- 增删改查
- AR和model
- 模型事件
- 场景
- query查询
- 增删改
- AR查询器
- 模型关系定义
- AR模型连表查询
- fields
- where拼接
- 模块
- 创建模块
- 控制器
- 表单
- 跳转
- 响应
- 验证器
- Action
- 组件
- url
- 分页
- 验证码
- 缓存
- 文件上传
- 预启动组件
- 事件
- 自定义组件
- redis
- 日志
- 行为
- cookie和session
- 基础知识
- 创建一个类
- 配置一个类
- object基类
- component组件类特性
- phpstorm无法更改php等级
- url地址美化
- 过滤器
- 请求处理
- 请求组件
- 响应组件
- header
- 用户登录
- 实现IdentityInterface接口
- 登录
- 自动检测登录
- 获取用户信息
- 访问行为追踪
- phpstorm+postman断点调试