我遇到了多个路由的问题,其中一些不能工作。
/**
*
* @url GET /fetch
* @url GET /fetch/lazyload/:lazy
* @url GET /fetch/:id/
* @url GET /fetch/:id/lazyload/:lazy
* @url GET /fetch/start/:offset/limit/:limit
* @url GET /fetch/start/:offset/limit/:limit/lazyload/:lazy
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort/lazyload/:lazy
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort/orderby/:order
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort/orderby/:order/lazyload/:lazy
*/
protected function fetch($id = null, $offset = 0, $limit = 25, $lazy = false, $sort = 'asc', $order = null){
//override
throw new RestException(501);
}
对于实例
@url GET /fetch/start/:offset/limit/:limit
如果url为/fetch/start/1/limit/2
则不起作用,但如果为/fetch/start/1/2
则会起作用。
/fetch/:id/
将覆盖/fetch/lazyload/:lazy
因此/fetch/lazyload/true
将无法工作,识别出的模式将返回/fetch:id => lazyload
我是不是遗漏了什么,或者这种映射是不可能的?
谢谢。
发布于 2012-09-26 23:35:53
模棱两可在这里发挥了作用!阅读this thread以了解更多信息
简而言之,url中的参数是贪婪的,所以我们需要确保它们位于非贪婪的url之后。
例如,让我们讨论两个urls
simple\:param
simple\name
如果我们保持urls的顺序与上面相同,并调用simple\name
,那么只有映射到simple\:param
的api方法才会收到它,将参数设置为"name“。我们可以通过简单地将顺序更改为
simple\name
simple\:param
类似地,您可以使用以下内容修复您的api
/**
*
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort/orderby/:order/lazyload/:lazy
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort/orderby/:order
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort/lazyload/:lazy
* @url GET /fetch/start/:offset/limit/:limit/sort/:sort
* @url GET /fetch/start/:offset/limit/:limit/lazyload/:lazy
* @url GET /fetch/start/:offset/limit/:limit
* @url GET /fetch/lazyload/:lazy
* @url GET /fetch/:id/lazyload/:lazy
* @url GET /fetch/:id/
* @url GET /fetch
*/
protected function fetch($id = null, $offset = 0, $limit = 25, $lazy = false, $sort = 'asc', $order = null)
{
//override
throw new RestException(501);
}
HTH
https://stackoverflow.com/questions/12585640
复制相似问题