如何根据RESTful操作返回字段


How to return fields depending on RESTful action?

我正在Yii2中构建一个RESTful应用程序,我已经覆盖了模型中的fields()方法(扩展ActiveRecord),但我想根据请求是视图还是列表来定义要返回的字段。

通过在actions方法中转储$actions变量,可以很容易地在控制器中检查哪个RESTful操作正在使用。如何在模型中执行类似操作?我试着检查场景,但它当然是default

有几种方法,我将描述其中的两种。

1) 非常简单:在模型的fields()方法中调用'Yii::$app->controller->action->uniqueId来确定使用哪个操作。

2) 根据您的评论,ActionControlleractions方法中定义其操作,该方法返回操作数组及其配置,例如,对于视图操作:

'view' => [
    'class' => 'yii'rest'ViewAction',
    'modelClass' => $this->modelClass,
    'checkAccess' => [$this, 'checkAccess'],
],

因此,在您的子控制器中,您可以覆盖父实现,并为每个操作设置操作类,如下所示:

public function actions()
{
    $myActions = [
        'view' => [
            'class' => 'app'actions'MyViewAction',
        ]
    ];
    return ArrayHelper::merge(parent::actions(), $myActions);
}

这里app'actions'MyViewAction是您的自定义操作类,您可以从yii'rest'Action继承它并覆盖run()方法。

public function run($id)
{
    $model = $this->findModel($id);
    if ($this->checkAccess) {
        call_user_func($this->checkAccess, $this->id, $model);
    }
    $model->scenario = 'view';
    return $model;
}

然后在您的模型中检查场景并执行适当的操作。希望这将有助于