ZendFrameworkのMVC(Zend_Controller_Router_Route_Regex)  2009年4月29日

http://www.bshe.org/modules/xpress2/archives/56

では、.htaccessでHTMLテンプレートのパスとアプリケーションのパスを分離しました。そこで、分離されたリクエストを各コントローラーへ流す必要があります。

HTMLテンプレートのフォルダ構造に制限を設けないためにはテンプレートからコントローラーへのルートを定義する必要があります。そこで、Zend_Controller_Router_Route_Regexとiniファイルを利用してルートを定義できるようにしました。

前提条件

  • ●INIファイルにて各コントローラーアクションとHTMLテンプレートの対応を定義できるようにする。

実際の実装はBsheの以下のクラスを参照ください。(ダウンロードはこちら

  • ●Bshe_Specializer_Controller_Router

INIファイルの用意

以下のようなINIファイルを用意します。

; デフォルト
router.bshe.specializer.index = "(.*)"

router.test.test.index = "test.html"

デフォルトの部分は、特別な定義がない場合は、リクエストをbsheモジュールのspecializerコントロールのindexアクションにて処理することを示しています。

2つ目はtest.htmlへのアクセスがtestモジュールのtestコントローラーのindexアクションにて処理することを示しています。

test.htmlのところは、Zend_Controller_Router_Route_Regexで解釈可能な正規表現も利用できます。

routerクラスの作成

以下のようなルータークラスを用意しました。

class Bshe_Specializer_Controller_Router
{

    /**
     * Zend_Controller_Router_Rewriteのインスタンスを引数にとり
     * Bshe_Specializerのためのルーターをセットし、
     * Zend_Controller_Router_Rewriteのインスタンスを返すメソッド
     *
     * @param Zend_Controller_Router_Rewrite $router
     * @return Zend_Controller_Router_Rewrite
     */
    public static function createRouter($router = null)
    {
        try {
            // ルーター生成
            if ($router == null) {
                $router = new Zend_Controller_Router_Rewrite();
            }

            $routeNumber=0;

            // コンフィグクラス取得
            try {
                $config = Bshe_Registry_Config::getConfig(‘Bshe_Specializer’); : (1)
                if (isset ($config->router)) {
                    $arrayRoutes = $config->router->toArray();

                    // ルートセット
                    foreach ($arrayRoutes as $module => $controllers) {
                        foreach ($controllers as $controller => $actions) {
                            foreach ($actions as $action => $reg) {
                                $route = new Zend_Controller_Router_Route_Regex(
                                    $reg,
                                    array(
                                        ‘module’ => $module,
                                        ‘controller’ => $controller,
                                        ‘action’ => $action
                                    )
                                );
                                $router->addRoute($module . ‘_’ . $controller . ‘_’ . $action . ‘_’ . $routeNumber, $route);
                                $routeNumber++;
                            }
                        }
                    }
                }
            } catch (Bshe_Registry_Exception_Noconfigfile $e) {
                // コンフィグファイルなし、そのまま実行
            } catch (Exception $e) {
                // その他の例外
                throw $e;
            }

            return $router;
        } catch (Exception $e) {
            throw $e;
        }
    }
}

(1)のところは適宜、必要なINIファイルを読み込むように修正してください。

これにより、INIファイルに必要なルートを定義することで、テンプレートとZendFrameworkアプリケーションのフォルダ構造の分離が実現できます。

 

このエントリをはてなブックマークに登録 このエントリをBuzzurlにブックマーク Yahoo!ブックマークに登録 このエントリをlivedoorクリップに登録 Deliciousにブックマーク

コメントを投稿