5

我可以在 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。

4

3 回答 3

4

你在你的模型中做到这一点。

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()方法,该方法返回给定场景的所有活动属性。

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

于 2015-09-25T21:04:05.910 回答
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]);
    ...
}

应该这样做。

于 2015-12-14T18:36:31.150 回答
-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'];
    }
}

希望对你有用

于 2015-12-10T22:50:44.970 回答