我正在编写Yii2基本应用程序。有时我必须在控制器的动作作为局部访问时渲染视图,有时我必须使用布局渲染它们。这基于请求中的GET参数,因此我在操作中的代码如下所示:
public function actionIndex() {
$isApi = Yii::$app->request->get('api');
$dataProvider = new ActiveDataProvider([
'query' => Participant::find(),
]);
if ($isApi) {
return json_encode($this->renderPartial('index', [
'dataProvider' => $dataProvider,
]));
} else {
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
}
我对每个控制器中的每个动作都有完全相同的逻辑。我必须首先检查GET
api
变量的render
请求,然后根据我调用renderPartial
或queryGenerator(props)
函数。
有没有办法拦截每个动作中的渲染部分,并编写此代码以便为每个动作全局工作,而不是复制并粘贴到任何地方?
答案 0 :(得分:1)
您可以为此编写方法:
public function actionIndex() {
$dataProvider = new ActiveDataProvider([
'query' => Participant::find(),
]);
return $this->renderForApi('index', [
'dataProvider' => $dataProvider,
]);
}
protected function renderForApi($view, $params = []) {
$isApi = Yii::$app->request->get('api');
if ($isApi) {
return $this->asJson($this->renderPartial($view, $params));
}
return $this->render($view, $params);
}
您可以将renderForApi()
方法放入应用程序中的父控制器中,或将其置于特征中并在每个控制器中使用它。