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


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

    如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示:

    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/路径进行拦截

     

    调用某个文件夹目录下的index.php页面,假定现在所有模块使用单独的文件存放于class目录下,该目录与router平级,如下图所示:

     

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

       1: <!Doctype html>
       2: <html>
       3: <head>
       4: <title>路由测试~~</title>
       5: <meta http-equiv="content-type" content="text/html; charset=utf-8" />
       6: </head>
       7: <body>
       8:  
       9: <?php
      10:  
      11: date_default_timezone_set("Asia/Shanghai");
      12:  
      13: define("MODULE_DIR", "../class/");
      14:  
      15:  
      16: $_DocumentPath = $_SERVER['DOCUMENT_ROOT'];
      17: $_FilePath = __FILE__;
      18: $_RequestUri = $_SERVER['REQUEST_URI'];
      19:  
      20: $_AppPath = str_replace($_DocumentPath, '', $_FilePath);    //==>\router\index.php
      21: $_UrlPath = $_RequestUri;    //==>/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
      22:  
      23: $_AppPathArr = explode(DIRECTORY_SEPARATOR, $_AppPath);
      24:  
      25: /**
      26:  * http://192.168.0.33/router/hello/router/a/b/c/d/abc/index.html?id=3&url=http:
      27:  * 
      28:  * /hello/router/a/b/c/d/abc/index.html?id=3&url=http:
      29:  */
      30:  
      31: for ($i = 0; $i < count($_AppPathArr); $i++) {
      32:     $p = $_AppPathArr[$i];
      33:     if ($p) {
      34:         $_UrlPath = preg_replace('/^\/'.$p.'\//', '/', $_UrlPath, 1);
      35:     }
      36: }
      37:  
      38: $_UrlPath = preg_replace('/^\//', '', $_UrlPath, 1);
      39:  
      40: $_AppPathArr = explode("/", $_UrlPath);
      41: $_AppPathArr_Count = count($_AppPathArr);
      42:  
      43: $arr_url = array(
      44:     'controller' => 'index',
      45:     'method' => 'index',
      46:     'parms' => array()
      47: );
      48:  
      49: $arr_url['controller'] = $_AppPathArr[0];
      50: $arr_url['method'] = $_AppPathArr[1];
      51:  
      52: if ($_AppPathArr_Count > 2 and $_AppPathArr_Count % 2 != 0) {
      53:     die('参数错误');
      54: } else {
      55:     for ($i = 2; $i < $_AppPathArr_Count; $i += 2) {
      56:         $arr_temp_hash = array(strtolower($_AppPathArr[$i])=>$_AppPathArr[$i + 1]);
      57:         $arr_url['parms'] = array_merge($arr_url['parms'], $arr_temp_hash);
      58:     }
      59: }
      60:  
      61: $module_name = $arr_url['controller'];
      62: $module_file = MODULE_DIR.$module_name.'.class.php';
      63: $method_name = $arr_url['method'];
      64:  
      65: if (file_exists($module_file)) {
      66:     include $module_file;
      67:     
      68:     $obj_module = new $module_name();
      69:     
      70:     if (!method_exists($obj_module, $method_name)) {
      71:         die("要调用的方法不存在");
      72:     } else {
      73:         if (is_callable(array($obj_module, $method_name))) {
      74:             $obj_module -> $method_name($module_name, $arr_url['parms']);
      75:             
      76:             $obj_module -> printResult();
      77:         }
      78:     }
      79:     
      80: } else {
      81:     die("定义的模块不存在");
      82: }
      83:  
      84:  
      85: ?>
      86:  
      87: </body>
      88: </html>

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

    第三步,模块的编写

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

       1: <?php
       2:  
       3: class Hello {
       4:     
       5:     private $_name;
       6:     private $_varValue;
       7:     
       8:     function __construct() {
       9:         
      10:     }
      11:     
      12:     function router() {
      13:         $this->_name = func_get_arg(0);
      14:         $this->_varValue = func_get_arg(1);
      15:     } 
      16:     
      17:     function printResult() {
      18:         echo $this->_name;
      19:         echo "<p>";
      20:         echo var_dump($this->_varValue);
      21:         echo "</p>";
      22:     }
      23: }
      24:  
      25: ?>

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

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

    本文参考:

    《用原生PHP写一个像CodeIgniter的路由功能》

  • 相关阅读:
    deeplearning.ai 卷积神经网络 Week 1 卷积神经网络
    deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
    deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
    deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架
    deeplearning.ai 改善深层神经网络 week2 优化算法
    deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
    cs231n spring 2017 lecture8 Deep Learning Networks
    cs231n spring 2017 lecture7 Training Neural Networks II
    cs231n spring 2017 lecture6 Training Neural Networks I
    cs231n spring 2017 Python/Numpy基础
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/2595375.html
Copyright © 2020-2023  润新知