zoukankan      html  css  js  c++  java
  • 一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法

    CodeIgniter 框架最显著的特征就是 MVC 模式,它的做法就是提取 url 中的'分段', 映射到某个类的某个方法,从而由该方法来输出最终显示的页面内容。那么我们第一课中就是实现一个这样的原型框架。

    1. 新建 index.php 文件

    2. 提取 uri

     1 /**
     2  * --------------------------------------------------------------------
     3  * 获取 uri ,并通过 uri 调用相应的方法
     4  * --------------------------------------------------------------------
     5  */
     6 
     7 function detect_uri() {
     8     
     9     if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME'])) {
    10         return '';
    11     }
    12 
    13     $uri = $_SERVER['REQUEST_URI'];
    14     if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) {
    15         $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
    16     }
    17 
    18     if ($uri == '/' || empty($uri)) {
    19         return '/';
    20     }
    21 
    22     $uri = parse_url($uri, PHP_URL_PATH);
    23 
    24     // 将路径中的 '//' 或 '../' 等进行清理
    25     return str_replace(array('//', '../'), '/', trim($uri, '/'));
    26 }
    27 
    28 $uri = detect_uri();
    29 echo $uri;

    3. 提取 uri 中的分段信息

     1 function explode_uri($uri) {
     2 
     3     foreach (explode('/', preg_replace("|/*(.+?)/*$|", "\1", $uri)) as $val) {
     4         $val = trim($val);
     5         if ($val != '') {
     6             $segments[] = $val;
     7         }
     8     }
     9 
    10     return $segments;
    11 }
    12 
    13 $uri_segments = explode_uri($uri);
    14 print_r($uri_segments);

    4. 根据分段信息,调用相应类的方法

    1 // 调用类和方法
    2 $CI = new $class();
    3 
    4 $CI->$method();

    整个代码最终就完成了,为了测试效果,紧接着以上代码,写一个 包含 hello 方法的 Welcome 类,并输出 My first Php Framework!

    测试代码如下:

    class Welcome {
    
        function hello() {
            echo 'My first Php Framework!';
        }
    }

    现在,在浏览器中输入 http://localhost/learn-ci/index.php/welcome/hello

    就可以看到页面中显示(注意先去掉代码中的上面两个函数下面的 echo 和 print_r 调试语句 ) 

    My first Php Framework!


  • 相关阅读:
    例子:动能并不是特别强(2-3)后,下M5的同时,也是恢复期到期的前一天
    .NET 自带的动态代理+Expression 实现AOP
    自旋锁-SpinLock(.NET 4.0+)
    使用Nito.AsyncEx实现异步锁
    C# 两行代码实现 延迟加载的单例模式(线程安全)
    C++ 用于大型程序的工具
    C++ 模板与泛型编程
    C++ 面向对象编程
    C++ 重载操作符与转换
    C++ 复制控制
  • 原文地址:https://www.cnblogs.com/zhenyu-whu/p/3159856.html
Copyright © 2011-2022 走看看