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 相关文章推荐
PHP5中使用PDO连接数据库的方法
Aug 01 PHP
PHP操作MongoDB时的整数问题及对策说明
May 02 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 PHP
PHP多个文件上传到服务器实例
Oct 29 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
PHP生成随机数的方法实例分析
Jan 22 PHP
PHP实现自动识别Restful API的返回内容类型
Feb 07 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
PHP 文件上传限制问题
Sep 01 PHP
is_file和file_exists效率比较
Mar 14 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冒泡排序算法代码详细解读
2011/07/17 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
javascript基本类型详解
2014/11/28 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
如何基于python操作excel并获取内容
2019/12/24 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
初一学生评语大全
2014/04/24 职场文书
旅游节目策划方案
2014/05/26 职场文书
元旦趣味活动方案
2014/08/22 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
开除员工通知
2015/04/22 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
MySQL为id选择合适的数据类型
2021/06/07 MySQL
php去除deprecated的实例方法
2021/11/17 PHP
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python