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+DBM的同学录程序(3)
Oct 09 PHP
PHP新手上路(十二)
Oct 09 PHP
php基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
一个很不错的PHP翻页类
Jun 01 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
一个漂亮的php验证码类(分享)
Aug 06 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
php实现的通用图片处理类
Mar 24 PHP
php生成圆角图片的方法
Apr 07 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
JS 常用校验函数
2009/03/26 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
PyQt实现界面翻转切换效果
2018/04/20 Python
Python清空文件并替换内容的实例
2018/10/22 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
提高python代码运行效率的一些建议
2020/09/29 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
我的网上商城创业计划书
2013/12/26 职场文书
同志主要表现材料
2014/08/21 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
公务员个人总结
2015/02/12 职场文书
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技