当前位置:首页 > PHP教程 > php应用 > 列表

PHP URL路由类实例

发布:smiling 来源: PHP粉丝网  添加日期:2020-06-23 16:05:58 浏览: 评论:0 

本文介绍一个PHP URL路由类,很简单,值得学习。

前段时间写了个关于手机应用的api,一直是用的query_string这种地址,而且还是根据一个act参数来区分所有的动作,这种让开发人员看起来比较费眼。本来想改写为“?c=controller&m=method&type=3&id=1” 这种形式,利用m参数来载入文件并进行实例化,后来看了sina weibo api 是对地址进行了路由。也决定跟风对地址路由。本来CI框架自己自带路由效果,但是因为考虑是写api,想写的比较纯粹一点。

支持默认控制器(index)和方法(index):

  1. index.php 
  2. index.php/controller 
  3. index.php/controller/method 
  4. index.php/controller/method/prarme1/value1 
  5. index.php/controller/method/param1/value1/param2/value2..... 

具体类如下:

  1. <?phpdefine('MODULE_DIR''./classes/'); 
  2. $APP_PATHstr_replace($_SERVER['DOCUMENT_ROOT'], ''__FILE__);     
  3. $SE_STRING=str_replace($APP_PATH''$_SERVER['REQUEST_URI']);    //计算出index.php后面的字段 index.php/controller/methon/id/3 
  4. $SE_STRING=trim($SE_STRING,'/'); 
  5. //echo $SE_STRING.'<br>'; 
  6. //这里需要对$SE_STRING进行过滤处理。 
  7. $ary_url=array
  8.     'controller'=>'index'
  9.     'method'=>'index'
  10.     'pramers'=>array() 
  11.     ); 
  12. //var_dump($ary_url); 
  13. $ary_se=explode('/'$SE_STRING); 
  14. $se_count=count($ary_se); 
  15.  
  16. //路由控制 
  17. if($se_count==1 and $ary_se[0]!='' ){ 
  18.     $ary_url['controller']=$ary_se[0]; 
  19.  
  20. }else if($se_count>1){//计算后面的参数,key-value 
  21.     $ary_url['controller']=$ary_se[0]; 
  22.     $ary_url['method']=$ary_se[1]; 
  23.     if($se_count>2 and $se_count%2!=0){ //没有形成key-value形式 
  24.         die('参数错误'); 
  25.     }else
  26.         for($i=2;$i < $se_count;$i=$i+2){ 
  27.             $ary_kv_hash=array(strtolower($ary_se[$i])=>$ary_se[$i+1]); 
  28.             $ary_url[pramers]=array_merge($ary_url[pramers],$ary_kv_hash); 
  29.         } 
  30.     } 
  31.  
  32. $module_name=$ary_url['controller']; 
  33. $module_file=MODULE_DIR.$module_name.'.class.php'
  34. //echo $module_file; 
  35. $method_name=$ary_url['method']; 
  36. if(file_exists($module_file)){ 
  37.     include($module_file); 
  38.     $obj_module=new $module_name();    //实例化模块m 
  39.  
  40.     if(!method_exists($obj_module$method_name)){ 
  41.         die('方法不存在'); 
  42.     }else
  43.         if(is_callable(array($obj_module$method_name))){    //该方法是否能被调用 
  44.             //var_dump($ary_url[pramers]); 
  45.             $get_return=$obj_module->$method_name($ary_url[pramers]);    //执行a方法,并把key-value参数的数组传过去 
  46.             if(!is_null($get_return)){ //返回值不为空 
  47.                 var_dump($get_return); 
  48.             } 
  49.  
  50.         }else
  51.             die('该方法不能被调用'); 
  52.         } //phpfensi.com 
  53.  
  54.     } 
  55. else 
  56.     die('模块文件不存在'); 
  57. ?> 

Tags: URL路由类

分享到: