Yii2 - 拦截渲染动作

时间:2018-05-30 10:03:56

标签: yii2 rendering

我正在编写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请求,然后根据我调用renderPartialqueryGenerator(props)函数。

有没有办法拦截每个动作中的渲染部分,并编写此代码以便为每个动作全局工作,而不是复制并粘贴到任何地方?

1 个答案:

答案 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()方法放入应用程序中的父控制器中,或将其置于特征中并在每个控制器中使用它。