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

В настоящее время у меня есть маршрут REST, работающий для контроллера событий (/event). Я хотел бы обработать регистрации событий в контроллере Event SignUp и сопоставить этот контроллер с маршрутом /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/ рейтинги будут переведены в Product_RatingsController, что означает RatingsController в модуле Products. Поскольку все мои контроллеры размещены в модуле по умолчанию, желаемое поведение не поддерживается маршрутом отдыха.

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

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

Другие вопросы по тегам