完整項目地址:https://github.com/Evai/Aier
上一篇中我們已經建立了一個空的 Composer 項目,本篇將講述如何構建路由。
下面我們就開始自己來構建路由,先去 GitHub 搜一下:點此查看搜索結果
推薦 https://github.com/NoahBuscher/Macaw,對應的 Composer 包為 noahbuscher/macaw 。
下面開始安裝它,更改 composer.json:
{
"require": {
"noahbuscher/macaw": "dev-master"
}
}
運行 composer update,成功之后將得到以下目錄:

至此,Macaw 包安裝成功!
下面,就是見證奇跡的時刻!我們將賦予 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('/', function() { echo "Welcome"; }); Macaw::get('/name/(:all)', function($name) { echo 'Your name is '.$name; }); Macaw::error(function() { echo '404'; }); 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
目前的代碼使用 Apache + mod_php 和 Nginx + php-fpm 方式均沒有問題。
我在本地綁定了 81 端口,訪問 http://127.0.0.1/name/Evai可以看到:

如果頁面亂碼,請調整編碼為 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('/',function(){...}) 中的兩個參數。第一個參數是我們想要監聽的 URL 值,第二個參數是一個 PHP 閉包,作為回調,代表 URL 匹配成功后我們想要做的事情。
4. __callstatic() 做的事情也很簡單,分別將目標URL(即 /)、HTTP方法(即 GET)和回調代碼壓入 $routes、$methods 和 $callbacks 三個 Macaw 類的靜態成員變量(數組)中。
5. 路由文件最后一行的 Macaw::dispatch(); 方法才是真正處理當前 URL 的地方。能直接匹配到的會直接調用回調,不能直接匹配到的將利用正則進行匹配。
