提问者:小点点

Codeigniter路由和REST服务器


我正在尝试为我的API实现以下URL(我正在使用Codeigniter和Phil Sturgeon的REST服务器库):

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

我不希望网址有尾随的“索引”

/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.”显然,我的控制器中没有限制方法。

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

非常感谢您的帮助!


共2个答案

匿名用户

//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
    }
}

匿名用户

Gregory,正如你自己所说的/玩家指的是玩家控制器中的索引方法,这意味着如果你的路由是干净的,你不应该需要有$路由['玩家']='玩家/索引'。

您可以拥有任意多的段,并获得URI类来在脚本中区分它们。这意味着默认情况下,这个网址“/球员/菜鸟/限制/10/偏移/5/键/abcdef”应该会导致你的球员控制器,菜鸟()方法。以下是你如何获得你的片段:

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

此外,对于/玩家/工作限制:

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
}