フレームワークの処理に介入するには以前はコールバック関数を使った方法が主流でした。クラスの継承とメソッドのオーバーライドを使った方法は比較的わかりやすいものでしたが、下記のような問題があります。

  • コールバックを使うためだけにサブクラスを作るのは面倒
  • 独自のクラス階層を作っているとコールバックを差し込む場所をよく考える必要がある
  • コールバックを差し込んだ箇所を後から探すのが難しい

ControllerからViewを表示する前になんらかの処理を行うという拡張をコールバックを使った方法で行った場合は下記のようになります。

AppController extends Controller
{
    public function beforeRender() {
        //do something
    }
}

CakePHP2.1から採用されたEventManagerを使う事で上記の問題をシンプルに解決できます。ControllerからViewを表示する前になんらかの処理を行う場合、以下のようなコードをbootstrap.phpや任意のコントローラーの中など好きな場所に書けば動作します。

App::uses('CakeEventManager', 'Event');
function hoge() {
     //do something
    return true;
}
CakeEventManager::instance()->attach(
    'hoge',
    'Controller.beforeRender'
);

コールバックを使った方法よりもシンプルかつ柔軟に記述することができます。苦手意識がある方も是非試してみてください。