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 相关文章推荐
利用 window_onload 实现select默认选择
Oct 09 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
PHP7.0版本备注
Jul 23 PHP
yii数据库的查询方法
Dec 28 PHP
PHP消息队列用法实例分析
Feb 12 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 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/01/26 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
浅谈django中的认证与登录
2016/10/31 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
django 中QuerySet特性功能详解
2019/07/25 Python
pycharm运行scrapy过程图解
2019/11/22 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
收入证明申请书
2015/06/12 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫