【发布时间】:2010-03-01 10:36:53
【问题描述】:
我正在尝试为我的网站实现一个 REST API。
我的问题是默认的 Zend 路由妨碍了。我第一次尝试使用 Zend_Rest_Route 但我无法理解我应该如何将它正确用于“深度”路由,即 website/api/resource1/filter/resource2/id。
使用默认的 Zend 路由,我需要创建一个巨大的 Resource1Controller 来处理所有可能的操作,我认为这不是“好”的方法。
我尝试过使用 Resauce (http://github.com/mikekelly/Resauce/),创建一个 api 模块并添加路由,但我无法让它正常工作:
我添加的模式是:
$this->addResauceRoutes(array(
'api/resource' => 'resource',
'api/resource/:id' => 'custom',
'api/resource/filter' => 'resource-filter',
'api/resource/filter/:id' => 'custom',
));
这导致了这个:
public function addResauceRoutes($routes) {
$router = Zend_Controller_Front::getInstance()->getRouter();
foreach ($routes as $pattern => $controller) {
$router->addRoute($controller,
new Zend_Controller_Router_Route($pattern, array(
'module' => 'api',
'controller' => $controller
)
)
);
}
Zend_Controller_Front::getInstance()->setRouter($router);
- website/api/resource 让我 Resource1Controller,好的
- website/api/resource/filter 将我带到 resource1filterController,好的
- website/api/resource/filter/:id 让我 一个自定义控制器,好的
- 我希望 website/api/resource/:id 将我带到同一个自定义控制器...但它会将我重定向到 Resource1Controller。
有什么解决方案可以让我正确创建我的 API? Zend_Rest_Route 有什么好的方法吗?
编辑:迈克,
我觉得我不适合使用不同的控制器,因为我需要路径“website/api/resource/:id”和“website/api/resource/filter/:id”来给我几乎准确的相同的结果(唯一的区别是因为过滤器在那里,我可能会在此处收到一条消息,告诉“内容已过滤”)。
当我可以使用相同的控制器并检查是否存在参数“过滤器”时,我认为创建另一个几乎相同的控制器是一种浪费。
但是,我不想使用基本的 Zend 路由,因为对于路径“website/api/resource/filter/resource2”,我希望有一个完全不同的行为,所以我想使用另一个控制器,特别是因为我正在尝试使用 Zend_Rest_Action 并且需要我的控制器使用基本操作 getAction()、putAction()、postAction() 和 deleteAction()。
【问题讨论】:
标签: zend-framework rest routing