乌徒帮技术范儿技术中心开发框架 › CI控制器中_remap()详解:CodeIgniter中的URL控制

CI控制器中_remap()详解:CodeIgniter中的URL控制

分类:开发框架

在CI控制器中使用_remap()对该控制器的访问路径进行重新路由,它将彻底打碎原来的class/function/p1/p2的模式,而是你自己在该函数中的重新规定。

在网上仅有的一些参考中,没有对该方法做出非常详尽的说明,手册中更是寥寥几笔。结合经验,乌徒帮将直接结合例子代码进行解读。

class User extends CI_Controller {

?? ?public function index($user_id = ''){}

?? ?public function station($user_id = ''){}

?? ?// 修改URL
?? ?public function _remap($method,$params = array())
?? ?{
?? ??? ?if(is_numeric($method) && empty($params[0])){
?? ??? ??? ?return $this->index($method);
?? ??? ?}
?? ??? ?if(is_numeric($method) && !empty($params[0])){
?? ??? ??? ?return $this->$params[0]($method);
?? ??? ?}
?? ??? ?show_404();
?? ?}

}

我们来看一下上面user控制器中的_remap情况。我们给了_remap两个参数,$method和$params。我们用一些访问路径来对应解释:

1、www.utubon.com/user

2、www.utubon.com/user/1204

3、www.utubon.com/user/1204/station

我们来看1,虽然user控制器中有index函数,但www.utubon.com/user却会显示404页面,因为_remap中并没有规定该控制器下后面没有uri段时如何操作。如何要执行操作,我们可以通过if($method == 'index')来增加这个段的操作。

再来看2,这个路劲我们能访问原网址为www.utubon.com/user/index/1204(现在已经无法访问)的页面。

if(is_numeric($method) && empty($params[0])){
?? ?return $this->index($method);
}

这里,我们要解释一下_remap的参数$method,它指uri段中控制器类名之后的那个段,即本网址中的1204。如果你访问/user/home,$method == home,home被保存在了$method中,你可以利用$method来使用它,如把$method当做函数参数,甚至函数名来执行。

最后来看3,和上面2不同的是,如果不规定_remap,根本没有这个路径可以访问到的页面。

if(is_numeric($method) && !empty($params[0])){
?? ?return $this->$params[0]($method);
}

在了解到$method的意思之后,我们来了解参数$params = array()。对于CI来说,_remap只认user/后面的第一个uri段,即$method,之后的所有段都不认了,全部按照顺序存放到$params中,所以$params[0]就是后面的第二个段,$params[1]以此类推。在上面这段代码中,我获取了$params[0],然后调用和$params[0]相同的函数,并把$method作为参数,$this->$params[0]($method),这样一来,即实现了一个新的访问路径。

填写个人信息,赶快回复吧!