CakePHPのbeforeFilter()以降の処理を実行させないようにする

こんにちは!ぐちです。

共通処理

CakePHPでAPIを作った際に全API共通でパラメータチェックを行う際に親クラスのbeforeFilter()でチェックを行いますよね。その際にパラメータエラーになったりすると本来実行されるはずの後続のアクションの実行を止めて、その場でレスポンスを返したい場合があると思います。そういった場合に活用できるのがinvokeAction()アクションです。

invokeAction()

falseを返却するとbeforeFilter()以降の処理を止めることができます。ここの返却値をbeforeFilter()で行うパラメータチェックによって変えることによって共通のパラメータチェックなどの処理を実装することができます。

<?php

App::uses('Controller', 'Controller');

class ApiController extends AppController {
    private $isError = false;

    // アクションの前に実行
    public function beforeFilter() {
        parent::beforeFilter();
            if(!isset($this->request->query['hoge'])) {
                $this->isError = true;
                $this->setResponse(array('status' => '1', 'msg' => '必須パラメータがありません。'));
            }
        }
    }

    public function invokeAction(CakeRequest $request) {
        if ($this->isError) {
            return false;
        }
        return parent::invokeAction($request);
    }

    // アクションの後に実行
    public function beforeRender() {
        parent::beforeRender();
    }

    protected function setResponse($response = array()) {
        $this->viewClass = 'Json';
        $this->set('response', $response);
        $this->set('_serialize', array('response'));
    }
}

bool値を表すクラス変数を定義し、beforeFilter()でエラー判定を行いエラーの場合はフラグを立てます。レスポンスをセットすることで本来であれば後続のアクションが処理されますが、invokeAction()にてフラグがセットされている場合はfalseを返しているので後続のアクションが処理されることはありません。

コードを見ればおわかりになると思うので説明はこの辺にしておきます。

CakePHPで用意されている機能をうまく活用すればシンプルな構成で様々なことができるようになりますね。

では今回はこの辺で。