アクションクラスの拡張

例えば、id:kunitさんのActiveGatewayを使えるようにすることを考えてみる。

まず、通常のMoony_Actionのサブクラスを作成、標準でActiveGatewayのインスタンス生成:

class EnhancedAction extends Moony_Action {
  function execute($request, $session, $view) {
    $gw =& new ActiveGateway();
    $gw->setDSN('mysql://id:password@host/db');
    $this->process($request, $session, $view, $gw);
  }
  /**
   * @abstract
   */
  function process($request, $session, $view, $gw) {}
}

個別のアクションクラスは上記EnhancedActionのサブクラスとして実装する。例えば:

class FooAction extends Moony_EnhancedAction {
  function process($request, $session, $view, $gw) {
    // 処理を記述
    $id = $request->get('user_id');            // リクエストパラメータ取得
    $user = $gw->find('user', $id);            // idをキーにuserテーブル検索
    $view->assign('user_name', $user->name);   // テンプレートに設定
    $view->forward();                          // テンプレートFoo.tpl表示
  }
}

もちろん、ActiveGateway以外のライブラリ(PEAR::DB、PDOとか)を共通で使用したい場合も同様。フレームワーク側で用意されているアクションクラスを継承、カスタマイズしていくのはStrutsの定石のひとつ。