频道直达 - 专题 - 新闻 - 基础 - 高级 - 安装 - 技巧 - 数据库 - 手册 - PHP - Linux - Java - MySQL - Apache - 麻辣堂 - 狼盟 - Rails社群 - 搜索 - 下载 - 开源 - 论坛

大话URL映射之我见

来源:www.phpres.com 作者:Angelover 出处:www.phpres.com 2007-9-11 17:49:32 进入讨论组
关 键 词: 大话 path controller router strpos 解析 if params

   1、大家来说说URL映射吧
   一般url映射有两种方式,一种是通过mod_rewrite实现,这种网上教材很多我也不多说了。另外一种是在程序中模拟,比如类似zend Framework中的那种方式/index.php/controller/action/var1/value1/var2/value2/。这里方式其实最主要是通过一个统一的输入接口,然后对url进行解析,最后转发到相应的controller中的module。

    我这里写了两个简单函数来模拟。
    第一个函数主要是进行地址解析,把类似/index.php/controller/action/var1/value1/var2/value2/的地址解析出来,一般来说要解析成三部分:controller,module,params。

<?
/**
  *对url路由进行简单的解析,支持对/path/to/site/index.php/module/action/parm/value
  * /path/to/site/index.php?/module/action/parm/value和
  * /path/to/site/?/module/action/parm/value三种形式的处理
  *@param:null
  *@return:router array
  */
function url_router
(){
   
$path=strip_tags($_SERVER['REQUEST_URI'
]);
   
$strpos=strpos($path,'.php'
);
   if(
$strpos
){
       
$path=substr($path,$strpos+4
);  
   }else{
       if(empty(
$_SERVER['QUERY_STRING'
])){
           
$strpos=strpos($path,'?'
);
           if(
$strpos
){
              
$path=substr($path,$strpos+1
);
           }else{
              
$path=''
;
           }
       }else{
           
$path=$_SERVER['QUERY_STRING'
];
       }
   }
   
//统一化$path的格式,如果$path的第一个字符为/则去掉
   
if($path[0]=='/'
){
       
$path=substr($path,1
);
   }
   
//解析,并且路由
   
if(!empty($path
)){
       
$path=explode('/',$path
);
       
$router['controller']=$path[0
];
       
$router['action']=(!empty($path[1]))?$path[1]:'index'
;
       
//print_r($path);
       
for($i=2;$i<sizeof($path);$i=$i+2
){
           
$params[$path[$i]]=(isset($path[$i+1]))?$path[$i+1]:''
;
       }
       
$router['params']=$params
;
   }else{
       
//默认路由信息
       
$router['controller']='index'
;
       
$router['action']='index'
;
       
$router['params'
]=array();
   }
   return 
$router
;
}
?>

    这里就完成主要的url解析功能,然后是转发映射,下面这个函数实现(注意这个函数的实现是结合了我自己的架构,所以你采用的话需要相应的修改,当然你的MVC如果类似zend Framework,那应该要该的不多。)

<?
function url_dispatch($router,$app_path='/app/controllers/'
)
{
   require_once(
SERVER_PATH.'/libs/controller.class.php'
);
   
$controller=$router['controller'].'Controller'
;
   
//echo SERVER_PATH.$app_path.$controller.'.class.php';
   
if(!file_exists(SERVER_PATH.$app_path.$controller.'.class.php'))die('缺少必要的类!'
);
   require_once(
SERVER_PATH.$app_path.$controller.'.class.php'
);
   
$controller=new $controller
();
   
$controller->_setParam($router['params'
]);
   
$controller->{$router['action'].'Action'
}();
   return 
true
;
}
?>
欢迎进入PHP开发资源论坛讨论。
收藏此文】【 】【打印】【关闭
相关文章
图文推荐
论 坛 资 源
PHP开发资源网奋斗目标
阅读排行:
热门技术文档
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
编缉最近更新文章
网站赞助商
搜索您感兴趣的内容
 
   网站首页 -  网站地图 -  网站合作 -  手册中心 -  通用网址 -  网站论坛 -  网站投稿 -  友情链接 -  帮助中心
版权所有:PHP开发资源网 © 2003-2008 通用网址:PHP资源网 合作媒体: 赛迪网IT技术
互联网违法和不良信息举报中心 | 不良信息举报信箱