0

目前我有一个为事件控制器(/事件)工作的 REST 路由。我想在 EventSignUp 控制器中处理事件注册,并将此控制器映射到 /event/signups 路由。

Zend 框架文档声明 URL /event/signup/:id 应该映射到 Event_SignupController 。但这对我不起作用。

我为我的 Bootstrap 类中的所有控制器设置了默认的 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 Route 不支持我想要的行为。

所以这改变了我的问题,是否可以在不影响现有控制器对默认 Rest 路由的依赖的情况下实现我想要的行为?如果是这样,怎么做?如果没有,对我来说最好的方法是什么?

4

1 回答 1

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 数组会更好,但现在这可行。

于 2011-09-05T21:08:31.013 回答