【问题标题】:How to set up Hierarchical Zend Rest Routes?如何设置分层 Zend Rest 路由?
【发布时间】:2010-02-05 02:14:36
【问题描述】:

使用 Zend 框架,我正在尝试在按以下模式组织的资源上为 REST api 构建路由:

如何使用 Zend_Rest_Route 进行设置?

这是我在 bootstrap.php 文件中为用户资源 (users/:id) 设置路由的方式:

  $this->bootstrap('frontController');
  $frontController = Zend_Controller_Front::getInstance();
  $restRoute = new Zend_Rest_Route($frontController);
  $frontController->getRouter()->addRoute('default', $restRoute);

[据我了解,这是一条包罗万象的路线,因此 users/324/items/34 将导致参数设置为 id=324 和 items=34 并且所有内容都将映射到用户(前端模块)模型.从那里我想我可以测试 items 参数并在 get 请求上为用户 #324 检索项目 #34。]

访问 /users/234/items/43 和

var_dump($this->_getAllParams());

在 rest 控制器的 get 操作中会产生以下输出:

array(4) {
 ["controller"]=> string(5) "users"
 ["action"]=>  string(3) "get"
 [2]=>  string(5) "items"  ["module"]=>  string(7) "default"]
}

不知何故,两个 id 都丢失了......

有人吗?

【问题讨论】:

    标签: php zend-framework zend-route zend-rest zend-rest-route


    【解决方案1】:

    我将解决方案开源到 github 并作为 composer 包。见https://github.com/aporat/Application_Rest_Controller_Route

    我添加了一个扩展 Zend_Controller_Router_Route 的新类,并添加了添加自定义 restful 路由的能力,例如

    $frontController = Zend_Controller_Front::getInstance();
    $frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages']));
    

    【讨论】:

    • 谢谢!有趣的是,我最初想将它用于我的 URL users/:user_id/messages,这正是您示例中的 URL!
    【解决方案2】:

    AFAIK,Zend_Rest_Route 中没有允许您执行此类操作的功能。有一个提案,但不确定何时实施。您可以在 Bootstrap 中添加它以设置此自定义路由。

    $front = $this->getResource('FrontController'); 
    $testRoute = new Zend_Controller_Router_Route(
        'users/:user_id/items/:item_id',
        array(
            'controller' => 'users',
            'action' => 'item',
            'module' => 'default'
        )
    );
    
    $front->getRouter()->addRoute('test', $testRoute);
    

    user_iditem_id 在 UsersController 的 itemAction 中作为参数可用:

    $user_id = $this->_request->getParam('user_id');
    

    【讨论】:

    • 感谢您的回答。你是对的我最终不得不放弃 Zend_Rest_Route 因为当前的实现不支持这样的方案。我终于去了 Zend_Controller_Router_Route with Chains:stackoverflow.com/questions/2250353/…
    【解决方案3】:

    Zend_Rest_Route 仅在有 1 个参数时才将控制器名称后的第一个参数映射到 'id'。

    我想出的最佳解决方案是继承 Zend_Rest_Route 并覆盖 match() 函数。复制 Zend_Rest_Route 的 match 函数,但在“Digest URI Params”注释之前添加以下内容(大约 60 行)。

    if($pathElementCount > 1 && $path[0] != 'id') {
        $params['id'] = urldecode($path[0]);
        array_shift($path);
    }  
    

    这应该为您提供所需的功能。

    【讨论】:

    • 我已经按照你说的做了。但是,你如何使用它呢?我在我的 routes.init routes.tasktypesstatus.map.1 = "type_id" 中期待这样的东西,但它不起作用:/
    • 这个解决方案是完美的。奇迹般有效。只需要创建你的类来扩展 Zend_Rest_Route。应该包括构造函数和匹配函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多