0

我遇到了多个路由的问题,其中一些无法正常工作。

/**
 * 
 * @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

我错过了什么,或者这种映射是不可能的?

谢谢你。

4

1 回答 1

1

歧义在这里发挥了作用!阅读此线程以了解更多信息

简而言之,url中的参数是贪婪的,所以我们需要确保它们出现在非贪婪的url之后

例如让我们谈谈两个 url

  1. simple\:param
  2. simple\name

如果我们将 url 保持与上面相同的顺序并调用simple\name,则只有映射到的 api 方法simple\:param才会接收它,并将 param 设置为“name”。我们可以通过简单地改变顺序来解决这个问题

  1. simple\name
  2. 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);
}

高温高压

于 2012-09-26T15:35:53.390 回答