代码之家  ›  专栏  ›  技术社区  ›  mmvsbg

yii2-拦截渲染操作

  •  0
  • mmvsbg  · 技术社区  · 7 年前

    我在写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 功能。

    是否有方法在每个操作中截取呈现部分,并编写此代码以在全局范围内为每个操作工作,而不是在任何地方复制和粘贴它?

    1 回复  |  直到 7 年前
        1
  •  1
  •   rob006    7 年前

    您可以为此编写方法:

    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() 方法放入应用程序的父控制器或将其放入trait并在每个控制器中使用。