PHP实现一个简单url路由功能实例


Posted in PHP onNovember 05, 2016

什么是php的路由机制

1、路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数。举个例子,如:http://main.test.com/article/1  其中:/article/1  -> ?_m=article&id=1。

2、然后将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程。

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染。很多时候可能是这样子写:xxx.com/xx?c=x&m=x&t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:)

如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示:PHP实现一个简单url路由功能实例

game.weibo.com后面匹配到的项,指向了某个php页面,然后根据参数获取要访问的游戏应用标识,后数据库或者缓存里查询该应用标识,如果不存在则输出错误提示,如果应用存在则加载游戏应用链接地址。

 现在写一个php例子,假设我的ip为192.168.0.33,我加了一层名为router的路径,之后跟随的是 “/模块名/方法名/参数1的key/参数1的value/….”

类似这样的地址:

192.168.0.33/router/Hello/router/a/b/c/d/abc/index.html?id=3&url=http:………………

也就是要调用Ha这个模块中的router方法,并传入url后面的参数/a/b/c/d/index………….

 第一步,首先要在服务器的配置上对/router/路径进行拦截PHP实现一个简单url路由功能实例
调用某个文件夹目录下的index.php页面,假定现在所有模块使用单独的文件存放于class目录下,该目录与router平级,如下图所示:
PHP实现一个简单url路由功能实例

第二步,路由分发器的实现(index.php)

<!Doctype html>
 <html>
 <head>
 <title>路由测试~~</title>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 </head>
<body>
<?php
date_default_timezone_set("Asia/Shanghai");
 define("MODULE_DIR", "../class/");
 $_DocumentPath = $_SERVER['DOCUMENT_ROOT'];
 $_FilePath = __FILE__;
 $_RequestUri = $_SERVER['REQUEST_URI']; 
 $_AppPath = str_replace($_DocumentPath, '', $_FilePath);  //==>\router\index.php
 $_UrlPath = $_RequestUri;  //==>/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 $_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);
 
 /**
 * http://192.168.0.33/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 * 
 * /hello/router/a/b/c/d/abc/index.html?id=3&url=http:
 */ 
 for ($i = 0; $i < count($_AppPathArr); $i++) {
   $p = $_AppPathArr[$i];
   if ($p) {
    $_UrlPath = preg_replace('/^\/'.$p.'\//', '/', $_UrlPath, 1);
   }
 }
 
 $_UrlPath = preg_replace('/^\//', '', $_UrlPath, 1);
 
 $_AppPathArr = explode("/", $_UrlPath);
 $_AppPathArr_Count = count($_AppPathArr);
 
 $arr_url = array(
  'controller' => 'index',
   'method' => 'index',
   'parms' => array()
 );
 
 $arr_url['controller'] = $_AppPathArr[0];
 $arr_url['method'] = $_AppPathArr[1];
 
 if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) {
   die('参数错误');
 } else {
   for ($i = 2; $i < $_AppPathArr_Count; $i += 2) {
     $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]);
     $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash);
   }
 }
 
 $module_name = $arr_url['controller'];
 $module_file = MODULE_DIR.$module_name.'.class.php';
 $method_name = $arr_url['method'];
 
 if (file_exists($module_file)) {
   include $module_file;
   
   $obj_module = new $module_name();
   
   if (!method_exists($obj_module, $method_name)) {
     die("要调用的方法不存在");
  } else {
     if (is_callable(array($obj_module, $method_name))) {
       $obj_module -> $method_name($module_name, $arr_url['parms']);
       
       $obj_module -> printResult();
     }
   }
   
 } else {
   die("定义的模块不存在");
 }
  
 ?>
 
</body>
 </html>

 获取请求的uri,然后拿到要加载的模块名、调用方法名,对uri参数进行简单的判断..

第三步,模块的编写

根据上述的uri,我们要调用的是Hello模块下的router方法,那么可以在class目录下定义一个名为Hello.class.php的文件(注意linux下是区分大小写的)

<?php
class Hello {
 private $_name;
private $_varValue;
   
   function __construct() {
     
   }
   
   function router() {
     $this->_name = func_get_arg(0);
     $this->_varValue = func_get_arg(1);
   }   
   function printResult() {
    echo $this->_name;
    echo "<p>";
    echo var_dump($this->_varValue);
     echo "</p>";
  }
 }
 ?>

同理,我们可以编写Ha模块..

这算是实现了很简单的url路由分发功能了…

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 手机归属地查询 api
Feb 08 PHP
apache mysql php 源码编译使用方法
May 03 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
Jan 11 PHP
php的curl封装类用法实例
Nov 07 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
php 可变函数使用小结
Jun 12 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 06 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 #PHP
php foreach如何跳出两层循环(详解)
Nov 05 #PHP
PHP不使用递归的无限级分类简单实例
Nov 05 #PHP
php  单例模式详细介绍及实现源码
Nov 05 #PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 #PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 #PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 #PHP
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
layui表格数据重载
2019/07/27 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
wxPython中listbox用法实例详解
2015/06/01 Python
详解python Todo清单实战
2018/11/01 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
linux面试题参考答案(5)
2016/11/05 面试题
毕业生自荐信
2013/12/14 职场文书
实习生的自我评价
2014/01/08 职场文书
机关会计岗位职责
2014/04/08 职场文书
留学顾问岗位职责
2014/04/14 职场文书
小学校本培训方案
2014/06/06 职场文书
校庆标语集锦
2014/06/25 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
2014年纪委工作总结
2014/12/05 职场文书
学雷锋日活动总结
2015/02/06 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
主持人开场白台词
2015/05/29 职场文书