我正在尝试为我的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正常工作?
非常感谢您的帮助!
//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
}