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 相关文章推荐
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
php里array_work用法实例分析
Jul 13 PHP
解析WordPress中的post_class与get_post_class函数
Jan 04 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
php设计模式之单例模式代码
Jun 11 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP chr()函数讲解
Feb 11 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 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实现的Cookies操作类实例
2014/09/24 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
对vue中methods互相调用的方法详解
2018/08/30 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
python读取csv文件示例(python操作csv)
2014/03/11 Python
Python实现简单的代理服务器
2015/07/25 Python
详解python中list的使用
2019/03/15 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
详解Python 循环嵌套
2020/07/09 Python
学python爬虫能做什么
2020/07/29 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
应届毕业生如何写求职信
2014/02/16 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
中学教师读书笔记
2015/07/01 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android