2009-04-27 26 views
11

Zend Frameworkで私のカスタムルートの定義をどのように短くすることができますか?私は現在この定義を持っています:Zend Frameworkのルート定義を短くする

$route = new Zend_Controller_Router_Route(
    ":module/:id", 
    array(
     "controller" => "index", 
     "action" => "index" 
    ), 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutOne', $route); 

$route = new Zend_Controller_Router_Route(
    ":module/:controller/:id", 
    array("action" => "index"), 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutTwo', $route); 

$route = new Zend_Controller_Router_Route(
    ":module/:controller/:action/:id", 
    null, 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutThree', $route); 

これらのルールをうまく組み合わせる方法はありますか? これはどこに置くのがベストプラクティスですか?私は現在、フロントコントローラの初期化の直後にブートストラップクラスにそれらを持っています。

答えて

6

このようなルートを設定するときは、設定ファイルを使用します。設定として、XMLを使用して自分の設定データを保存しますが、これらは他のサポートされている形式でも簡単に保存できます。次に、設定からのルートをブートストラップのルータに追加します。

設定:

<config> 
    <routes> 
     <shortcutone type="Zend_Controller_Router_Route"> 
      <route>:module/:id</route> 
      <defaults> 
       <controller>index</controller> 
       <action>index</action> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcutone> 
     <shortcuttwo type="Zend_Controller_Router_Route"> 
      <route>:module/:controller/:id</route> 
      <defaults> 
       <controller>index</controller> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcuttwo> 
     <shortcutthree type="Zend_Controller_Router_Route"> 
      <route>:module/:controller/:action/:id</route> 
      <defaults> 
       <controller>index</controller> 
       <action>index</action> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcutthree> 
    </routes> 
</config> 

ブートストラップ

$config = new Zend_Config_Xml('config.xml'); 
$router = Zend_Controller_Front::getInstance()->getRouter(); 
$router->addConfig($config, 'routes'); 

もちろん、そこに他のオプションがあると、私はこの上documentationをお読みになることをお勧めしたい、しかし、これはあなたのために適合例。

+0

ありがとうございました。私はあなたのブートストラップをスリムに保つためにconfigを使用します:) –

8

私のroutes.iniファイルが非常に大きくなり始めたので、解析した後にZend Cachingを使ってキャッシュをキャッシュすることにしました。バックエンドのキャッシュソリューションにXcacheを使用しました。ここでbootstrap.phpのファイルに置かれるべきコードは、です:

 
protected function _initRoutes() 
{ 
    $backendType = 'Xcache'; 
    $backendOptions = array(); 

    // Instantiate a caching object for caching the routes 
    $cache = Zend_Cache::factory('File', $backendType, 
    array(
     'automatic_serialization' => true, 
     'master_files'=>array(APPLICATION_PATH . '/configs/routes.ini') 
    ), 
    $backendOptions 
); 

    $frontController = Zend_Controller_Front::getInstance();   

    if(! $router = $cache->load('router')) { 

    // Load up .ini file and put the results in the cache 
    $routes = new Zend_Config_Ini (APPLICATION_PATH . '/configs/routes.ini', 'production');    
    $router = $frontController->getRouter(); 
    $router->addConfig($routes, 'routes'); 

    $cache->save($router, 'router'); 
    }  
    else {   
    // Use cached version 
    $frontController->setRouter($router); 
    } 

} 
私はそれがよりZendの様およびはるかに軽量でコンパクトなのでZendのを使用する場合は特にXMLS上* .iniファイルを使用することを好む
+0

こんにちは、それはSerialControllerではないPDOConnectionを処理するFrontControllerを処理するので、ルータオブジェクトをキャッシュする方法が不思議です... – Trent

7

。ここにはZend_Config_Ini()を使用したほぼ同じ設定があります。

のapplication.ini

[routes] 
routes.shortcutone.route=:module/:id 
routes.shortcutone.defaults.controller=index 
routes.shortcutone.defaults.action=index 
routes.shortcutone.reqs=\d+ 

bootstrap.phpの

$config = new Zend_Config_Ini('application.ini', 'routes'); 
$router = Zend_Controller_Front::getInstance()->getRouter(); 
$router->addConfig($config, 'routes'); 

application.iniファイル内[routes]セクションの名前を変更することができますのでご注意ください。名前を変更すると、2番目のパラメータZend_Config_Ini()に新しいセクションタイトルが反映されます。

+3

'routes.shortcutone.reqs。 id = \ d + '? –

関連する問題