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 相关文章推荐
MySQL相关说明
Jan 15 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php验证session无效的解决方法
Nov 04 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php中的动态调用实例分析
Jan 07 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
Jun 17 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 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
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
PHP实现微信发红包程序
2015/08/24 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python 实现两个线程交替执行
2020/05/02 Python
python中列表的含义及用法
2020/05/26 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
高校十八大报告感想
2014/01/27 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
反四风问题学习心得体会
2016/01/22 职场文书