SOHOゆいちのサイト
http://www.bshe.org/modules/xpress2/archives/56
では、.htaccessでHTMLテンプレートのパスとアプリケーションのパスを分離しました。そこで、分離されたリクエストを各コントローラーへ流す必要があります。
HTMLテンプレートのフォルダ構造に制限を設けないためにはテンプレートからコントローラーへのルートを定義する必要があります。そこで、Zend_Controller_Router_Route_Regexとiniファイルを利用してルートを定義できるようにしました。
前提条件
実際の実装はBsheの以下のクラスを参照ください。(ダウンロードはこちら)
以下のような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で解釈可能な正規表現も利用できます。
以下のようなルータークラスを用意しました。
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アプリケーションのフォルダ構造の分離が実現できます。
www.bshe.org (created by itassist.info)