Yii1.1でCInlineFilterを使ってControllerにフィルター処理を実装する


はじめに

WebアプリケーションのMVCフレームワークだと、各コントローラーのアクションの実行前後で、共通処理を行う場面がよくある。
この場合は下記のように、フレームワーク側で専用のライフサイクルメソッドが提供されていることが多いだろう。

  • beforeAction
  • afterRender

Yiiの場合も上記のようなメソッドは存在しますが、
それとは別に、フィルターという機能で、フィルタリンング処理を行う事が可能だ。
今回はControllerクラスでフィルターの機能の実装例を紹介する。

Yiiとフィルター

その前にどのような仕組みでこのフィルター機能が各コントローラーのアクションの前後で実行されているかを説明する。
Yii1.1.にはCFilter クラスとがあり、このクラスを継承したサブクラスとして、以下が提供されている。

これらのクラスは各コントローラーのfiltersメソッドで指定する。
指定されたフィルタークラスはCFilterChainクラスでスタックされ、各コントローラーのアクションの前後で順次実行される。
今回はこの中から、CInlineFilterを利用してコントローラークラスにフィルターを実装した例を下記にコード付きで解説する。

実装例

対象のControllerクラスで以下のように実装する。
以下はアカウントチェック処理をフィルターで実装した例である。

TopController.php
class TopController extends CController
{
    public function filters()
    {
        return ['CheckAccount']; // (1)
    }

    // (2)
    public function filterCheckAccount(CFilterChain $filterChain) 
    {
        // @ToDo アカウントチェック処理のフィルター処理を実行
        $filterChain->run(); // (3)
    }
}

ポイントは以下の3点である。

(1) 対象のControllerクラスのfiltersメソッドにフィルター名を定義
(2) filter + (1)で追加したフィルター名のメソッドを定義し、フィルター処理を実装
(3) (2)で実装したメソッドの引数でCFilterChain::runを実行する

Controllerクラスのfiltersメソッドでは以下のように+/-を使用して、フィルターを適用/除外の指定も可能だ。
以下はcreate/editアクションのみにフィルターを適用する場合の実装例である。

class TopController extends CController
{
    public function filters()
    {
        return ['CheckAccount + create, edit'];
    }

    ...

    public function actionIndex()
    {
    }

    public function actionCreate()
    {
    } 

    public function actionEdit()
    {
    } 
}

参考