TOP書籍連動> リクエストハンドラ
フレームワークの役割とその構築
フレームワークの役割とその構築

第4回:フレームワークの役割と構築方法 〜 後編

著者:Darryl Patterson   2006/8/15
1   2  3  次のページ
リクエストハンドラ

   フレームワークの役割と構築方法についての解説は、今回で最後となります。

   リクエストハンドラはその名の通りリクエストを扱います。このフレームワークでは、次のようなことをします。
  • URLからModule とactionを取り出す
  • 要求されたModuleのインスタンスを作る
  • ユーザのアクションをチェックする
  • モジュールのアクションテンプレートを読み込む
  • 要求されたModuleへリクエストを送信する

表2:リクエストハンドラで行うこと

   リクエストハンドラはリクエストを受け取ると、それが正しいものかチェックして要求されたモジュールに送ります。どのような振る舞いをするかは、ユーザがリクエストを送ったModuleによります。リスト5を見てください。

リスト5
<?php
⁄**
 * 
 *
 * @author Darryl Patterson < darryl.patterson@eurorscg.com >
 * @copyright Euro RSCG 4D
 *
 *⁄


include_once('common/util/class-EnvironmentFactory.php');
include_once('common/util/class-ModuleFactory.php');
require_once('common/util/class-Config.php');

class Handler {
    var $config;
    var $env;

    function Handler()
    {
        $this->config = Config::instance();

        $envFactory = new EnvironmentFactory(
          $this->config->getEnvironmentClassName());
        $this->env = $envFactory->createInstance();
    }

    function getHandledRequest($request)
    {
        if (isset($_SERVER['PATH_INFO']) &&
          $_SERVER['PATH_INFO'] != '/'){
            $pathSplit = explode('/',
              substr($_SERVER['PATH_INFO'], 1));

            if (isset($pathSplit[0])){
                $request['M'] = ucfirst($pathSplit[0]);
            }
            if (isset($pathSplit[1])){
                $request['action'] = $pathSplit[1];
            }
        }

        // モジュールが選択されていない時はデフォルトモジュールを設定
        if (!isset($request['M'])){
            $request['M'] = $this->config->defaultModule;
        }

        $factory = new ModuleFactory($request['M']);
        $module = $factory->createInstance();

        if (!$module->authenticateAction()){
            $redirect = '/'.$this->config->frontController;
            if (isset($request['M'])){
                $redirect .= '/' . $request['M'];
            }
            if (isset($request['action'])){
                $redirect .= '/' . $request['action'];
            }
            if (isset($_SERVER['QUERY_STRING']) &&
              $_SERVER['QUERY_STRING'] != ''){
                 $redirect .= '?' .
                   $_SERVER['QUERY_STRING'];
            }

            $this->env->session->setValue('loginRedirect',
              $redirect);
            header('Location: ' .
              $this->config->failedAuthenticationRedirect);
            exit(0);
        }

        if (!isset($request['action'])){
            $request['action'] = $module->defaultAction;
        }

        $module->loadTemplate($request['action']);

        return $module->getHandledRequest();
    }

}
?>

   getHandledRequest()関数の最初の部分を見ると、Moduleの名前とURLからアクションを決めていることがわかると思います。フロントコントローラには拡張子がないことを思い出してください。下のURLを見ると、フロントコントローラ(app)の後ろにデータがついていることがわかります。

   スラッシュではじまるデータが使えるのは、PHP_INFOでそのように設定しているからです。

フロントコントローラの一例
http://www.example.com/app/Default/login

   この場合、モジュールはDefaultで、アクションがloginになります。このURL全体を見ると、このリクエストは/app/Default/loginディレクトリのディレクトリインデックスにアクセスしているように見えます。

   アプリケーションで必要な追加データは、普通のクエリ文字列データかフォームのPOSTデータとして送られることに注意してください。

1   2  3  次のページ

PHPプログラマーズマガジン 書籍紹介
PHPプログラマーズマガジン

PHPプログラマーズマガジンは、PDF形式で読者の方にお届けするPHP言語(PHP: Hypertext Processor)専門誌です。 カナダMTA出版のphp|architect誌を日本語に翻訳し、独自の記事を加えて月刊でお届けしています。

発行:アシアル株式会社  価格:1,029円

 ご購入はこちら
http://www.phppro.jp/magazine/
Darryl Patterson
著者プロフィール
Darryl Patterson
1992年からWebプログラミングの仕事に従事している。彼はHTMLが使われはじめてから、その後Perl/CGI、Cold Fusion、ASPやPHPが使われるようになっていくWebの歴史とともに歩んできた。PHPでの開発は1998年から手がけており、今はトロントのEuro RSCG 4Dで開発チームのリーダー。また1995年からWebプログラミングをCentennial大学で教えており、そこでトロントのPHPユーザ会であるTorPUGを立ち上げた。


INDEX
第4回:フレームワークの役割と構築方法 〜 後編
リクエストハンドラ
  Moduleベースのコード
  単純なテンプレートエンジン -Renderers