2012-05-04 5 views
0

apiというモジュールでRESTful APIを公開するアプリケーションを作成しています。私BootstrapファイルファイルでZend Framework - Zend_Rest_Routeの追加時にオーバーライドされるカスタム定義のルート

[routes] 
routes.default_index_index.type = Zend_Controller_Router_Route 
routes.default_index_index.route =/
routes.default_index_index.defaults.module = default 
routes.default_index_index.defaults.controller = index 
routes.default_index_index.defaults.action = index 

今、私は次のルートを持っているデフォルトモジュールについて

$router = new Zend_Controller_Router_Rewrite(); 
foreach ($this->_modules as $module) { 
    if ($module === 'api') continue; 
    foreach ($this->_getConfigFiles($module) as $filename) { 
     $config = new Zend_Config_Ini($filename, 'routes'); 
     $router->addConfig($config, 'routes'); 
    } 
} 
return $router; 

:他のモジュールのために私は、カスタム定義されたルートとZend_Controller_Router_Rewriteオブジェクトを返す小さなクラスを作成しました私は以下を持っています:

$router = Shark_Module_Loader::getInstance()->getRouter(); 
$frontController->setRouter($router); 
$frontController->getRouter()->removeDefaultRoutes(); 
$apiRoute = new Zend_Rest_Route($frontController, array(), array('api')); 
$router->addRoute('rest', $apiRoute); 

残りのルートを追加するのをスキップすると、すべてデフォルトのモジュールでうまく動作します。しかし、RESTfulルートを追加すると、ルータに定義されたルートがオーバーライドされます(?)ので、モジュール($this->getFrontController()->getRouter()->getCurrentRoute();)のindexコントローラの現在のルートはZend_Rest_Routeのインスタンスです。ルート設定ファイルの上で定義されたカスタムルートにアクセスしようとするとこのように、言うことができます:

... 
routes.default_pages_view.type = Zend_Controller_Router_Route 
routes.default_pages_view.route = /view/:page 
routes.default_pages_view.defaults.module = default 
routes.default_pages_view.defaults.controller = pages 
routes.default_pages_view.defaults.action = view 
... 

私は要求アクション(get)が存在しないことを言って404エラーを取得します。

私はすでにドキュメントを閲覧しており、この動作を示唆するヒントは見当たりませんでした。

ご迷惑をおかけして申し訳ございません。

答えて

1

これを行う方法はありません。 (this questionをチェックしてください)

Zend_Controller_Router_Routeクラスを拡張する必要があります。私はこのようにそれをやった:

class Mauro_Controller_Router_Route_Method extends Zend_Controller_Router_Route { 

    protected $_method; 

    public function __construct($route, $defaults = array(), $reqs = array(), Zend_Translate $translator = null, $locale = null) { 
     list($this->_method, $route) = explode(' ', $route, 2); 
     parent::__construct($route, $defaults, $reqs, $translator, $locale); 
    } 

    public function match($path, $partial = false) { 
     $requestMethod = $this->getRequest()->getMethod(); 
     $requestMethod = $this->getRequest()->getParam('method') 
      ? strtoupper($this->getRequest()->getParam('method')) 
      : $requestMethod; 
     return $requestMethod == strtoupper($this->_method) 
      ? parent::match($path, $partial) 
      : false; 
    } 

    protected function getRequest() { 
     return Zend_Controller_Front::getInstance()->getRequest(); 
    } 

} 

あなたは、このようにそれを使用することができます:

良いアプローチをだ
$router->addRoute(new Mauro_Controller_Router_Route_Method('GET /view/:page', array('controller' => 'pages', 'action' => 'view'), array('page' => '/d+',))); 
+0

。 iniファイルにカスタムタイプのルートを設定することができました。それはルートがレールで定義される方法です。 –

+0

ええ、それに 'getInstance()'メソッドを追加する必要があります。これは、Zend_Applicationがルートをインスタンス化して.iniを使用してそれらを取得するために使用するものです。私は.iniを頻繁に使っていません。 – Mauro

関連する問題