2011-09-05 159 views
0

目前,我有一個適用於事件控制器(/ event)的REST路由。我想在EventSignUp控制器中處理事件SignUps,並將此控制器映射到/ event/signups路由。Zend Rest具有層次結構的路由

Zend Framework documentation指出URL/event/signup /:id應映射到Event_SignupController。但這對我不起作用。

我建立了我的自舉類中的所有控制器的默認REST路線:

$front = Zend_Controller_Front::getInstance(); 
$router = $front->getRouter(); 

// Specifying all controllers as RESTful: 
$restRoute = new Zend_Rest_Route($front); 
$router->addRoute('default', $restRoute); 

我缺少的東西或者是文檔只是錯了嗎?如果文檔錯誤,我應該採取什麼方法來實現我想要的目標?

作爲一個方面說明,很多現有的控制器都依賴於默認的REST路由,所以如果有一種解決方案不需要爲所有現有控制器實現新的路由,那將會很不錯。

編輯:文檔指出/ product/ratings將被轉換爲Product_RatingsController,這意味着Products模塊中的RatingsController。因爲我的所有控制器都放置在默認模塊中,所以我想要的行爲不受Rest路由支持。

所以這改變了我的問題,是否有可能實現我想要的行爲而不影響現有的控制器依賴於默認的休息路線?如果是這樣,怎麼樣?如果不是,我會採取什麼最好的方法?

+0

你看到Zend_Controller_Router_Route看起來http://stackoverflow.com/questions/4846726/zend-controller-router-route –

+0

是否有可能將GET,PUT,POST和DELETE請求與Zend REST中它們各自的方法進行匹配帶有Zend_Controller_Router_Route的控制器? –

+0

類似:$路線=新Zend_Controller_Router_Route中( '/ API /:ID', 陣列( '模塊'=> 'MyModule的', '控制器'=> 'myController的', '動作'=>用strtolower( $ request-> getMethod()), ) ); –

回答

1

基於Haim Evgi的評論,我創建了一個控制器插件,它根據請求方法添加Zend_Controller_Router_Route路由。這是控制器插件的代碼:

class TW_Webservice_Controller_Plugin_RestRoutes extends Zend_Controller_Plugin_Abstract 
{ 

    /** 
    * 
    * @var Zend_Controller_Router_Interface 
    */ 
    public $router; 

    /** 
    * Setup Rest routes that are not handled by the default Zend_Rest_Route object. 
    * 
    * @param Zend_Controller_Request_Abstract $request 
    */ 
    public function routeStartup(Zend_Controller_Request_Abstract $request) 
    { 
     $front = Zend_Controller_Front::getInstance(); 
     $this->router = $front->getRouter(); 

     $method = strtolower($request->getMethod()); 
     $restRoutes = array(
      '/event/signup' => 'event-signup' 
     ); 

     $this->addRoutes($method, $restRoutes); 
    } 

    /** 
    * 
    * @param string $method The request method 
    * @param array $restRoutes Router pattern => Controller name pairs 
    */ 
    public function addRoutes($method, $restRoutes) 
    { 
     foreach ($restRoutes as $routePattern => $controllerName) { 
      switch ($method) { 
       case "get": 
        $this->addGetRoutes($routePattern, $controllerName); 
        break; 
       case "post": 
        $this->addPostRoute($routePattern, $controllerName); 
        break; 
       case "put": 
        $this->addPutRoute($routePattern, $controllerName); 
        break; 
       case "delete"; 
        $this->addDeleteRoute($routePattern, $controllerName); 
        break; 
      } 
     } 
    } 

    /** 
    * 
    * @param string $routePattern 
    * @param string $controllerName 
    */ 
    public function addGetRoutes($routePattern, $controllerName) 
    { 
     $this->addRestRoute($routePattern, $controllerName, 'index'); 

     $routePattern = $routePattern . '/:id'; 
     $this->addRestRoute($routePattern, $controllerName, 'get'); 
    } 

    /** 
    * 
    * @param string $routePattern 
    * @param string $controllerName 
    */ 
    public function addPostRoute($routePattern, $controllerName) 
    { 
     $this->addRestRoute($routePattern, $controllerName, 'post'); 
    } 

    /** 
    * 
    * @param string $routePattern 
    * @param string $controllerName 
    */ 
    public function addPutRoute($routePattern, $controllerName) 
    { 
     $routePattern = $routePattern . '/:id'; 
     $this->addRestRoute($routePattern, $controllerName, 'put'); 
    } 

    /** 
    * 
    * @param string $routePattern 
    * @param string $controllerName 
    */ 
    public function addDeleteRoute($routePattern, $controllerName) 
    { 
     $routePattern = $routePattern . '/:id'; 
     $this->addRestRoute($routePattern, $controllerName, 'delete'); 
    } 

    /** 
    * 
    * @param string $routePattern 
    * @param string $controllerName 
    * @param string $action 
    */ 
    public function addRestRoute($routePattern, $controllerName, $action) 
    { 
     $route = new Zend_Controller_Router_Route($routePattern, array(
      'controller' => $controllerName, 
      'action' => $action 
     )); 

     $this->router->addRoute($controllerName . '-' . $action, $route); 
    } 

} 

如果$ restRoutes陣列從一個配置文件中檢索這將是更好的,但現在這個工程。