yii场景

来源:互联网 发布:全国安全知识网络竞赛 编辑:程序博客网 时间:2024/05/29 03:07

场景

模型可能在多个 场景 下使用,例如 User 模块可能会在收集用户登录输入, 也可能会在用户注册时使用。在不同的场景下, 模型可能会使用不同的业务规则和逻辑, 例如 email 属性在注册时强制要求有,但在登陆时不需要。

模型使用 yii\base\Model::scenario 属性保持使用场景的跟踪, 默认情况下,模型支持一个名为 default 的场景, 如下展示两种设置场景的方法:

// 场景作为属性来设置$model = new User;$model->scenario = 'login';// 场景通过构造初始化配置来设置$model = new User(['scenario' => 'login']);

默认情况下,模型支持的场景由模型中申明的 验证规则 来决定, 但你可以通过覆盖yii\base\Model::scenarios()方法来自定义行为, 如下所示:

namespace app\models;use yii\db\ActiveRecord;class User extends ActiveRecord{    const SCENARIO_LOGIN = 'login';    const SCENARIO_REGISTER = 'register';    public function scenarios()    {        return [            self::SCENARIO_LOGIN => ['username', 'password'],            self::SCENARIO_REGISTER => ['username', 'email', 'password'],        ];    }}

Info: 在上述和下述的例子中,模型类都是继承yii\db\ActiveRecord, 因为多场景的使用通常发生在Active Record 类中.

scenarios() 方法返回一个数组,数组的键为场景名,值为对应的 active attributes活动属性。 活动属性可被 块赋值 并遵循验证规则 在上述例子中,username 和 password 在login场景中启用,在 register 场景中, 除了 username and password 外 email 也被启用。

scenarios() 方法默认实现会返回所有yii\base\Model::rules()方法申明的验证规则中的场景, 当覆盖scenarios()时,如果你想在默认场景外使用新场景, 可以编写类似如下代码:

namespace app\models;use yii\db\ActiveRecord;class User extends ActiveRecord{    const SCENARIO_LOGIN = 'login';    const SCENARIO_REGISTER = 'register';    public function scenarios()    {        $scenarios = parent::scenarios();        $scenarios[self::SCENARIO_LOGIN] = ['username', 'password'];        $scenarios[self::SCENARIO_REGISTER] = ['username', 'email', 'password'];        return $scenarios;    }}

场景特性主要在验证 和 属性块赋值 中使用。 你也可以用于其他目的, 例如可基于不同的场景定义不同的 属性标签。

1 0
原创粉丝点击