在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),这样一来,即实现了一个新的访问路径。