2012-05-04 177 views
0

我正在創建一個應用程序,該模塊在名爲api的模塊中公開RESTful API。對於其它模塊我創建了一個小的類,返回一個Zend_Controller_Router_Rewrite對象,具有自定義的路線:Zend Framework - 添加Zend_Rest_Route時覆蓋的自定義定義路線

$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; 

對於默認的模塊,我有以下途徑:現在

[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 

,在我Bootstrap文件文件我有以下幾點:

$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路由時,路由器中定義的路由將被覆蓋(?),因此default模塊的index控制器的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 
... 

我得到一個404錯誤,指出請求的動作(get)不存在。

我已經通過了文檔,並沒有看到任何暗示這種行爲的提示。

任何幫助和指導,將不勝感激。

回答

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,因爲它會很大:P。 – Mauro