【问题标题】:Codeigniter routing and REST serverCodeigniter 路由和 REST 服务器
【发布时间】:2013-02-05 15:02:27
【问题描述】:

我正在尝试为我的 API 实现以下 URL(我正在使用 Codeigniter 和 Phil Sturgeon 的 REST server library):

/players            -> refers to index method in the players controller
/players/rookies    -> refers to rookies method in the players controller

我不希望 URL 有一个尾随的“索引”

/players/index

当我这样定义路由时,这根本没有问题:

$route['players'] = 'players/index';

一切都按预期进行。

我的问题是我需要像这样的额外 URL 段:

/players/rookies/limit/10/offset/5/key/abcdef

以上示例有效,但以下示例无效:

/players/limit/10/offset/5/key/abcdef

我收到以下错误:{"status":false,"error":"Unknown method."} 显然我的控制器中没有limit 方法。

如何设置我的 routes.php 配置文件以使这些 URL 正常工作?

非常感谢任何帮助!

【问题讨论】:

  • 我不得不说是的。至少我知道没有其他方法。
  • 我的理解是否正确,您希望两个 URL 在您的控制器中使用相同的方法?

标签: php codeigniter rest codeigniter-routing codeigniter-restserver


【解决方案1】:
//www.mysite.com/players
$route['players'] = 'players/index_get';//initial call to players index

//www.mysite.com/players/rookies
/** overrides the above **/
$route['players/(:any)'] = 'players/index_get/$1';//Changing defaults index

//www.mysite.com/players/rookies/10/4
/** overrides the above **/
$route['players/(:any)/(:num)/(:num)'] = 'players/index_get/$1/$2/$3';//Changing type,limit,offset

//All routes that are similar, like above that follow the previous, override the preceding one. 


//www.mysite.com/players/create
//overrides $route['players/(:any)']
$route['players/create'] = 'players/index_post';


class Players extends REST_Controller
{
    public $player_types = array();

    public function __construct(){
       $this->player_types = array(
          'rookies', 'seniors'
       );//manual assign or pull from db
    }
    /**
     * Index
     * $_GET
    **/
    public function index_get($type='rookies',$offset=0, $limit=0)//some defaults to show on initial call
    {
        // www.mysite.com/players/rookies
        // $route['players/(:any)'] = 'players/index_get/$1';
        // First uri segment, check to see if its a valid player 'type'

        if(!in_array(strtolower($type), $this->player_types)){
             //redirect ?
             return;
        }
    }
    /**
     * Index
     * $_POST
    **/
    public function index_post()
    {
        // Create a new player
    }
}

【讨论】:

  • 谢谢。我认为这指向了正确的方向。但是,我有两个不同的控制器用于 /players (index_get) 和 /players/rookies (rookies_get),因为这两个控制器可以有不同的参数(URL 段)。不过,我不确定是否可以这样设置。
  • 我会忘记 rookies_get 方法,因为 rookies 是玩家“类型”,因此我只会将每个“类型”路由到 index_get 第一个参数,更新答案以反映这一点。
  • 谢谢,菲利普。我会试试你的方法。
  • REST 正如我学习和学习的那样,意味着根据 HTTP 标头方法中的请求类型来解释该方法,因此您要做的就是调用 domain/players,它将重定向到基于适当的 method在 HTTP 标头上。在这里,您只是将 uri 调用路由到自定义方法,那么 REST 的目的是什么,即使使用任何控制器也是可能的。将任何 URI 路由到任何Controller > Method。 ://
  • 这是真正的 REST 吗?我不这么认为。路由将排除同一 URI 上的 PUT/GET。例如: /players/{playerId} 通过 GET 应该生成存在的播放器对象,但 PUT 应该使用请求中提供的数据更新播放器对象。此解决方案无法做到这一点,因为这两个请求都将被路由到 player_get 函数。
【解决方案2】:

gregory,正如您所说的“/players 指的是玩家控制器中的索引方法”,这意味着如果您的路由是,您不需要 $route['players'] = 'players/index'干净。

您可以拥有任意数量的段,并获取 URI 类以在脚本中区分它们。这意味着这个 URL “/players/rookies/limit/10/offset/5/key/abcdef” 默认应该指向你的玩家控制器,rookies() 方法。以下是获取细分的方法:

function rookies () {
    //$this->uri->segment (1); would return 'players' or 'limit'
    //$this->uri->segment (8); would return 'abcdef' or false
}

除了 /players/limit 工作:

function limit () {
    $this->rookies();
}

编辑 1

这是另一种方法:

路由规则:

$route['/players/rookies/limit/(:num)/offset/(:num)/key/(:any)'] = "players/get"
$route['/players/limit/(:num)/offset/(:num)/key/(:any)'] = "players/get"

在控制器中

function get () {
    //work with segments
}

【讨论】:

  • 感谢您的回答,@Aidas。上面提到的 REST 库提供了一个由应用程序扩展的自定义 REST 控制器,所以很遗憾您的回答不适用于我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 2017-12-20
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
相关资源
最近更新 更多