2011-09-05 2 views
0

현재 이벤트 컨트롤러 (/ 이벤트)에서 작동하는 REST 경로가 있습니다. EventSignUp 컨트롤러에서 Event SignUps를 처리하고이 컨트롤러를/event/signups 경로에 매핑하고 싶습니다.계층 구조가있는 Zend Rest Route

Zend Framework documentation은 URL/event/signup/: id가 Event_SignupController에 매핑되어야한다고 명시합니다. 그러나 이것은 나를 위해 작동하지 않습니다.

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

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

내가 뭔가를 놓치고 또는 문서 그냥 잘못이다 :

나는 내 부트 스트랩 클래스의 모든 컨트롤러의 기본 REST 경로를 설정? 문서가 잘못 되었다면 원하는 목표를 달성하기 위해 어떤 접근 방식을 취해야합니까?

부수적으로 많은 기존 컨트롤러는 기본 REST 경로에 의존하므로 모든 기존 컨트롤러에 대해 새 경로를 구현할 필요가없는 솔루션이 있으면 좋을 것입니다.

편집 : 설명서에는/product/ratings이 Products 모듈의 RatingsController를 의미하는 Product_RatingsController로 변환된다는 내용이 나와 있습니다. 모든 컨트롤러가 기본 모듈에 배치되므로 원하는 동작은 나머지 경로에서 지원되지 않습니다.

내 질문에 변경, 기본 휴식 경로에 대한 기존 컨트롤러 종속성에 영향을주지 않고 원하는 동작을 수행 할 수 있습니까? 그렇다면 어떻게? 그리고 그렇지 않다면, 제가 취할 수있는 최선의 방법은 무엇입니까?

+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/: 이드' 어레이 ( '모듈'=> '인 MyModule' '제어기'=> 'MYCONTROLLER' '액션'=>하여 strtolower ($ request-> getMethod()), ) ); –

답변

1

Haim Evgi의 의견을 토대로 요청 방법에 따라 Zend_Controller_Router_Route 경로를 추가하는 컨트롤러 플러그인을 만들었습니다. 이는 해당 컨트롤러 플러그인의 코드는 다음 $ restRoutes 배열이 설정 파일에서 검색하면

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); 
    } 

} 

그것은 더 좋은 것,하지만 지금이 작동합니다.