一步一步重寫 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!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM