restler多条路线

时间:2012-09-25 14:55:51

标签: php rest restler

我遇到了多个溃败问题,其中一些失败了。

/**
 * 
 * @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);
}

对于instace

@url GET /fetch/start/:offset/limit/:limit
如果网址为/fetch/start/1/limit/2

将无效 但如果/fetch/start/1/2

,它将有效

/fetch/:id/将覆盖/fetch/lazyload/:lazy

因此/fetch/lazyload/true无效,所识别的模式将返回/fetch:id => lazyload

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

谢谢。

1 个答案:

答案 0 :(得分:1)

歧义在这里发挥作用!阅读this thread了解更多

简而言之,网址中的参数是贪婪的,所以我们需要确保它们来自非贪婪的网址

例如,让我们谈谈两个网址

  1. simple\:param
  2. simple\name
  3. 如果我们按照与上面相同的顺序保留网址并调用simple\name,则只有映射到simple\:param的api方法才会收到设置参数作为“名称”。我们可以通过简单地将订单更改为

    来解决此问题
    1. simple\name
    2. simple\:param
    3. 同样,您可以使用以下

      修复您的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