利用 Composer 一步一步構建本身的 PHP 框架(二)——構建路由

本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composerphp

 

上一篇中咱們已經創建了一個空的 Composer 項目,本篇將講述如何構建路由。git

 

久負盛名的 CodeIgniter 框架是不少人的 PHP 開發入門框架,一樣也是我開始學習如何從頭構建一個網站的框架。在 CI 中我學到了不少,其中對 MVC 的深刻理解和對框架本質的理解對個人影響最大。從使用框架是爲了提升開發效率的角度來看,框架的本質就是路由。github

 

下面咱們就開始本身來構建路由,先去 GitHub 搜一下:點此查看搜索結果json

 

推薦 https://github.com/NoahBuscher/Macaw,對應的 Composer 包爲 noahbuscher/macaw 。數組

下面開始安裝它,更改 composer.json:服務器

 

{
  "require": {
    "noahbuscher/macaw": "dev-master"
  }
}

運行 composer update,成功以後將獲得如下目錄:閉包

 

QQ20141013-2.jpg

至此,Macaw 包安裝成功!composer

 

下面,就是見證奇蹟的時刻!咱們將賦予 MFFC 生命力,讓它真正地跑起來!框架

 

新建 MFFC/public 文件夾,這個文件夾將是用戶惟一可見的部分。在文件夾下新建 index.php 文件:函數

 

<?php

// Autoload 自動載入
require '../vendor/autoload.php';

// 路由配置
require '../config/routes.php';

 

上面一行表示引入 Composer 的自動載入功能,下面一行表示載入路由配置文件。新建 MFFC/config 文件夾,在裏面新建 routs.php 文件,內容以下:

 

<?php

use NoahBuscher\Macaw\Macaw;

Macaw::get('fuck', function() {
  echo "成功!";
});

Macaw::get('(:all)', function($fu) {
  echo '未匹配到路由<br>'.$fu;
});

Macaw::dispatch();

 

Macaw 的文檔位於 https://github.com/NoahBuscher/Macaw,請按照你的 HTTP 服務軟件類型自行設置僞靜態,其實跟絕大多數框架同樣:「將全部非靜態文件所有指向 index.php」。

 

而後,將某一個端口用 Apache 或 Nginx 分配給 MFFC/public 目錄,這一步十分建議用 Apache 或者 Nginx 作。

若是使用 PHP 內置 HTTP 服務器:

 

cd public && php -S 127.0.0.1:3000

將致使路由的 Macaw::get('fuck' 必須寫成 Macaw::get('/fuck' 才能響應。

 

目前的代碼使用 Apache + mod_php 和 Nginx + php-fpm 方式均沒有問題。

 

我在本地綁定了 81 端口,訪問 http://127.0.0.1:81/fuck 能夠看到:

Image

若是頁面亂碼,請調整編碼爲 UTF-8。若是你成功看到以上頁面,那麼恭喜你,路由配置成功!

 

Macaw 只有一個文件,去除空行總共也就一百行多一點,經過代碼咱們能直接看明白它是怎麼工做的。下面我簡略分析一下:

1. Composer 的自動加載在每次 URL 驅動 MFFC/public/index.php 以後會在內存中維護一個全量命名空間類名到文件名的數組,這樣當咱們在代碼中使用某個類的時候,將自動載入該類所在的文件。

2. 咱們在路由文件中載入了 Macaw 類:「use NoahBuscher\Macaw\Macaw;」,接着調用了兩次靜態方法 ::get(),這個方法是不存在的,將由 MFFC/vendor/codingbean/macaw/Macaw.php 中的 __callstatic() 接管。

3. 這個函數接受兩個參數,$method 和 $params,前者是具體的 function 名稱,在這裏就是 get,後者是此次調用傳遞的參數,即Macaw::get('fuck',function(){...}) 中的兩個參數。第一個參數是咱們想要監聽的 URL 值,第二個參數是一個 PHP 閉包,做爲回調,表明 URL 匹配成功後咱們想要作的事情。

4. __callstatic() 作的事情也很簡單,分別將目標URL(即 /fuck)、HTTP方法(即 GET)和回調代碼壓入 $routes、$methods 和 $callbacks 三個 Macaw 類的靜態成員變量(數組)中。

5. 路由文件最後一行的 Macaw::dispatch(); 方法纔是真正處理當前 URL 的地方。能直接匹配到的會直接調用回調,不能直接匹配到的將利用正則進行匹配。

相關文章
相關標籤/搜索