如何设置Hierarchical Zend Rest Routes?

时间:2010-02-05 02:14:37

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

使用Zend Framework,我试图在以下列模式组织的资源上构建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并且所有内容都将映射到Users(前端模块)模型。从那里我想我可以只测试items参数并在get请求中检索用户#324的#34项。]< ===我刚检查过它并且似乎没有那样工作:

Acessing / users / 234 / items / 43和

var_dump($this->_getAllParams());

在其余控制器的get动作中产生以下输出:

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

不知怎的,两个ids都迷路了......

任何?

3 个答案:

答案 0 :(得分:6)

我开源解决方案到github和作为一个作曲家包。见https://github.com/aporat/Application_Rest_Controller_Route

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

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

答案 1 :(得分:5)

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_id item_id 在UsersController中的itemAction中可用作参数:

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

答案 2 :(得分:3)

只有当有1个参数时,Zend_Rest_Route才会将控制器名称后面的第一个参数映射为“id”。

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

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

这应该会为您提供您正在寻找的功能。