Yii2:我可以使用场景为不同的操作指定不同的模型字段集吗?

时间:2015-09-19 10:30:06

标签: yii2 yii2-advanced-app yii2-model

我可以在Yii2模型页面(http://www.yiiframework.com/doc-2.0/yii-base-model.html)中看到"字段"您可以根据某些上下文信息设置"不同字段列表的部分。例如,根据$ scenario或当前应用程序用户的权限,您可以返回不同的可见字段集或过滤掉某些字段。"

但是,场景文档(http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios)表示场景用于为模型属性验证创建不同的上下文。

我正在使用Yii2 Restful API,我必须使用默认操作(actionIndex,actionView,...)从模型中获取数据并显示为API结果。我知道我可以覆盖这些方法(http://www.yiiframework.com/doc-2.0/guide-rest-controllers.html#extending-active-controller),但是如何在这些方法中使用不同的字段集(取决于不同的场景)?

我需要的是为actionIndex(项目列表)输出field1,field2,field3,但我想为actionView(项目列表)输出field1,field2,field3,field4。

3 个答案:

答案 0 :(得分:2)

你在你的模特中做到了。

Yii2中的默认REST实现仅包含fields()方法返回的属性。默认情况下,该方法返回所有属性。因此,您可以这样定义:

class MyModel extends ActiveRecord
{
    //...
    public function fields()
    {
        switch ($this->scenario) {
            case 'my_scenario_1':
                return ['field1', 'field2'];
            case 'my_scenario_2':
                return ['field3', 'field4'];
        }
    }
}

此外,您可以使用scenarios()方法,它会返回给定方案的所有活动属性。

不要忘记设置模型'控制器中的场景。

答案 1 :(得分:-1)

这是我解决这个问题的方法,使用Yii :: $ app()

public function fields()
{
    if(Yii::$app->controller->action->uniqueId == 'controller/action'){
        return ['field_1','field_2','field_3','field_4'];
    }else{
        return ['field_1','field_3'];
    }
}

希望对你有用

答案 2 :(得分:-1)

根据本指南:http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

首先在模型中设置场景。例如:

const SCENARIO_LESS = 'index';
const SCENARIO_MORE = 'view';

public function scenarios()
{
    return [
        self::SCENARIO_LESS => ['field1', 'field2'],
        self::SCENARIO_MORE => ['field1', 'field2', 'field3'],
    ];
}

现在在您的操作中,只需设置如下场景:

// scenario is set through configuration
public function actionIndex()
{
    $model = new User(['scenario' => User::SCENARIO_LESS]);
    ...
}
...
public function actionView()
{
    $model = new User(['scenario' => User::SCENARIO_MORE]);
    ...
}

应该这样做。