Zend Rest Route с иерархией - PullRequest
       41

Zend Rest Route с иерархией

0 голосов
/ 05 сентября 2011

В настоящее время у меня есть маршрут REST, работающий для контроллера событий (/ event). Я хотел бы обработать регистрации событий в контроллере EventSignUp и сопоставить этот контроллер с маршрутом / event / signups.

Документация Zend Framework гласит, что URL / event / signup /: id должен сопоставляться с Event_SignupController. Но это не работает для меня.

Я установил маршрут REST по умолчанию для всех контроллеров в своем классе Bootstrap:

$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 / rating будет переведен в Product_RatingsController, что означает RatingsController в модуле Products. Поскольку все мои контроллеры размещены в модуле по умолчанию, желаемое поведение не поддерживается маршрутом отдыха.

Так что это меняет мой вопрос: возможно ли достичь желаемого поведения, не влияя на зависимость существующих контроллеров от маршрута по умолчанию Rest? Если так, то как? И если нет, то какой мне лучше всего подойти?

1 Ответ

1 голос
/ 06 сентября 2011

Основываясь на комментариях 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 был извлечен из файла конфигурации, но сейчас это работает.

...