PHP URL路由类实例


Posted in PHP onNovember 12, 2013

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

index.php
index.php/controller
index.php/controller/method
index.php/controller/method/prarme1/value1
index.php/controller/method/param1/value1/param2/value2.....

具体类如下:

<?phpdefine('MODULE_DIR', './classes/');
$APP_PATH= str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__);    
$SE_STRING=str_replace($APP_PATH, '', $_SERVER['REQUEST_URI']);    //计算出index.php后面的字段 index.php/controller/methon/id/3
$SE_STRING=trim($SE_STRING,'/');
//echo $SE_STRING.'<br>';
//这里需要对$SE_STRING进行过滤处理。
$ary_url=array(
    'controller'=>'index',
    'method'=>'index',
    'pramers'=>array()
    );
//var_dump($ary_url);
$ary_se=explode('/', $SE_STRING);
$se_count=count($ary_se);
//路由控制
if($se_count==1 and $ary_se[0]!='' ){
    $ary_url['controller']=$ary_se[0];
}else if($se_count>1){//计算后面的参数,key-value
    $ary_url['controller']=$ary_se[0];
    $ary_url['method']=$ary_se[1];
    if($se_count>2 and $se_count%2!=0){ //没有形成key-value形式
        die('参数错误');
    }else{
        for($i=2;$i < $se_count;$i=$i+2){
            $ary_kv_hash=array(strtolower($ary_se[$i])=>$ary_se[$i+1]);
            $ary_url[pramers]=array_merge($ary_url[pramers],$ary_kv_hash);
        }
    }
}

$module_name=$ary_url['controller'];
$module_file=MODULE_DIR.$module_name.'.class.php';
//echo $module_file;
$method_name=$ary_url['method'];
if(file_exists($module_file)){
    include($module_file);
    $obj_module=new $module_name();    //实例化模块m
    if(!method_exists($obj_module, $method_name)){
        die('方法不存在');
    }else{
        if(is_callable(array($obj_module, $method_name))){    //该方法是否能被调用
            //var_dump($ary_url[pramers]);
            $get_return=$obj_module->$method_name($ary_url[pramers]);    //执行a方法,并把key-value参数的数组传过去
            if(!is_null($get_return)){ //返回值不为空
                var_dump($get_return);
            }
        }else{
            die('该方法不能被调用');
        }
    }
}
else
{
    die('模块文件不存在');
}
?>
PHP 相关文章推荐
PHP编实现程动态图像的创建代码
Sep 28 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
探讨如何在PHP开启gzip页面压缩实例
Jun 09 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
Smarty使用自定义资源的方法
Aug 08 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
May 30 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
PHP set_error_handler()函数使用详解(示例)
Nov 12 #PHP
php inc文件使用的风险和注意事项
Nov 12 #PHP
php防止SQL注入详解及防范
Nov 12 #PHP
php session劫持和防范的方法
Nov 12 #PHP
php后门URL的防范
Nov 12 #PHP
php打开远程文件的方法和风险及解决方法
Nov 12 #PHP
php使用exec shell命令注入的方法讲解
Nov 12 #PHP
You might like
PHP临时文件的安全性分析
2014/07/04 PHP
php实现水印文字和缩略图的方法示例
2016/12/29 PHP
新手入门常用代码集锦
2007/01/11 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
vue项目实战总结篇
2018/02/11 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
js实现随机点名功能
2020/12/23 Javascript
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
百度JavaScript笔试题
2015/01/15 面试题
购房意向书范本
2014/04/01 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
肖申克救赎观后感
2015/06/02 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python
Python实现双向链表基本操作
2022/05/25 Python