我正在Yii2中构建一个RESTful应用程序,我已经覆盖了模型中的fields()方法(扩展了ActiveRecord),但我想根据请求是视图还是列表来定义要返回的字段。
通过在actions方法中转储$ actions变量,可以很容易地检查控制器正在使用哪个RESTful操作。我怎样才能在模型中做类似的事情?我尝试检查方案,但当然是default
。
答案 0 :(得分:2)
有几种方法,我将描述其中两种。
1)非常简单明了:在模型\Yii::$app->controller->action->uniqueId
方法中调用fields()
以确定使用了哪种操作。
2)根据您的评论, ActionController 在actions
方法中定义其操作,该方法返回操作数组及其配置,例如:对于查看操作:
'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;
}
然后检查模型中的方案并执行适当的操作。希望这会有所帮助