2011-09-05 156 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阵列从一个配置文件中检索这将是更好的,但现在这个工程。