我可以在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。
答案 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]);
...
}
应该这样做。