用 Composer構(gòu)建自己的 PHP 框架之構(gòu)建路由
上一篇中我們已經(jīng)建立了一個(gè)空的 Composer 項(xiàng)目,本篇將講述如何構(gòu)建路由。
久負(fù)盛名的 CodeIgniter 框架是很多人的 PHP 開發(fā)入門框架,同樣也是我開始學(xué)習(xí)如何從頭構(gòu)建一個(gè)網(wǎng)站的框架。在 CI 中我學(xué)到了很多,其中對(duì) MVC 的深入理解和對(duì)框架本質(zhì)的理解對(duì)我的影響最大。從使用框架是為了提高開發(fā)效率的角度來看,框架的本質(zhì)就是路由。
下面我們就開始自己來構(gòu)建路由,先去 GitHub 搜一下:點(diǎn)此查看搜索結(jié)果
推薦https://github.com/NoahBuscher/Macaw,對(duì)應(yīng)的 Composer 包為codingbean/macaw ,作者應(yīng)該是在 GitHub 上改名了,這可能會(huì)造成一定的困擾。下面開始安裝 Macaw 包,更改 composer.json:
{ "require": { "codingbean/macaw": "dev-master" }}
運(yùn)行 composer update,成功之后將得到以下目錄:

至此,Macaw 包安裝成功!
下面,就是見證奇跡的時(shí)刻!我們將賦予 MFFC 生命力,讓它真正地跑起來!
新建 MFFC/public 文件夾,這個(gè)文件夾將是用戶唯一可見的部分。在文件夾下新建 index.php 文件:
<?php// Autoload 自動(dòng)載入require '../vendor/autoload.php';// 路由配置require '../config/routes.php';
上面一行表示引入 Composer 的自動(dòng)載入功能,下面一行表示載入路由配置文件。新建 MFFC/config 文件夾,在里面新建 routs.php 文件,內(nèi)容如下:
<?phpuse NoahBuscher\Macaw\Macaw;Macaw::get('fuck', function() { echo "成功!";});Macaw::get('(:all)', function($fu) { echo '未匹配到路由<br>'.$fu;});Macaw::dispatch();
Macaw 的文檔位于https://github.com/NoahBuscher/Macaw,請(qǐng)按照你的 HTTP 服務(wù)軟件類型自行設(shè)置偽靜態(tài),其實(shí)跟絕大多數(shù)框架一樣:“將所有非靜態(tài)文件全部指向 index.php”。
然后,將某一個(gè)端口用 Apache 或 Nginx 分配給 MFFC/public 目錄,這一步十分建議用 Apache 或者 Nginx 做。
如果使用 PHP 內(nèi)置 HTTP 服務(wù)器:
cd public && php -S 127.0.0.1:3000
將導(dǎo)致路由的Macaw::get('fuck' 必須寫成Macaw::get('/fuck' 才能響應(yīng)。
目前的代碼使用 Apache + mod_php 和 Nginx + php-fpm 方式均沒有問題。
我在本地綁定了 81 端口,訪問http://127.0.0.1:81/fuck 可以看到:

如果頁(yè)面亂碼,請(qǐng)調(diào)整編碼為 UTF-8。如果你成功看到以上頁(yè)面,那么恭喜你,路由配置成功!
Macaw 只有一個(gè)文件,去除空行總共也就一百行多一點(diǎn),通過代碼我們能直接看明白它是怎么工作的。下面我簡(jiǎn)略分析一下:
1. Composer 的自動(dòng)加載在每次 URL 驅(qū)動(dòng) MFFC/public/index.php 之后會(huì)在內(nèi)存中維護(hù)一個(gè)全量命名空間類名到文件名的數(shù)組,這樣當(dāng)我們?cè)诖a中使用某個(gè)類的時(shí)候,將自動(dòng)載入該類所在的文件。
2. 我們?cè)诼酚晌募休d入了 Macaw 類:“use NoahBuscher\Macaw\Macaw;”,接著調(diào)用了兩次靜態(tài)方法 ::get(),這個(gè)方法是不存在的,將由MFFC/vendor/codingbean/macaw/Macaw.php 中的__callstatic() 接管。
3. 這個(gè)函數(shù)接受兩個(gè)參數(shù),$method 和 $params,前者是具體的 function 名稱,在這里就是 get,后者是這次調(diào)用傳遞的參數(shù),即 Macaw::get('fuck',function(){...}) 中的兩個(gè)參數(shù)。第一個(gè)參數(shù)是我們想要監(jiān)聽的 URL 值,第二個(gè)參數(shù)是一個(gè) PHP 閉包,作為回調(diào),代表 URL 匹配成功后我們想要做的事情。
4.__callstatic() 做的事情也很簡(jiǎn)單,分別將目標(biāo)URL(即 /fuck)、HTTP方法(即 GET)和回調(diào)代碼壓入$routes、$methods 和$callbacks 三個(gè) Macaw 類的靜態(tài)成員變量(數(shù)組)中。
5. 路由文件最后一行的Macaw::dispatch(); 方法才是真正處理當(dāng)前 URL 的地方。能直接匹配到的會(huì)直接調(diào)用回調(diào),不能直接匹配到的將利用正則進(jìn)行匹配。
- PHP創(chuàng)建自己的Composer包方法
- PHP 開發(fā)者該知道的 5 個(gè) Composer 小技巧
- 用 Composer構(gòu)建自己的 PHP 框架之使用 ORM
- 用 Composer構(gòu)建自己的 PHP 框架之設(shè)計(jì) MVC
- 用 Composer構(gòu)建自己的 PHP 框架之基礎(chǔ)準(zhǔn)備
- PHPer 需要了解的 5 個(gè) Composer 小技巧
- PHP管理依賴(dependency)關(guān)系工具 Composer的自動(dòng)加載(autoload)
- PHP管理依賴(dependency)關(guān)系工具 Composer 安裝與使用
- 如何使用PHP依賴管理工具Composer
相關(guān)文章
PHP SPL標(biāo)準(zhǔn)庫(kù)之接口(Interface)詳解
這篇文章主要介紹了PHP SPL標(biāo)準(zhǔn)庫(kù)之接口(Interface)詳解,本文分別講解了Coutable接口、OuterIterator接口、RecursiveIterator接口、SeekableIterator接口、SplObserver和SplSubject接口等內(nèi)容,需要的朋友可以參考下2015-05-05
Yii2中關(guān)聯(lián)查詢簡(jiǎn)單用法示例
這篇文章主要介紹了Yii2中關(guān)聯(lián)查詢簡(jiǎn)單用法,涉及Yii2的數(shù)據(jù)庫(kù)查詢方法及鏈?zhǔn)讲僮骱?jiǎn)單使用技巧,需要的朋友可以參考下2016-08-08
php curl請(qǐng)求信息和返回信息設(shè)置代碼實(shí)例
這篇文章主要介紹了php curl請(qǐng)求信息和返回信息設(shè)置代碼實(shí)例,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-04-04
thinkPHP3.2.3實(shí)現(xiàn)阿里大于短信驗(yàn)證的方法
這篇文章主要介紹了thinkPHP3.2.3實(shí)現(xiàn)阿里大于短信驗(yàn)證的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
Yii2表單事件之Ajax提交實(shí)現(xiàn)方法
這篇文章主要介紹了Yii2表單事件之Ajax提交實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Yii2框架中ajax提交的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05
封裝ThinkPHP的一個(gè)文件上傳方法實(shí)例
這篇文章主要介紹了封裝ThinkPHP的一個(gè)文件上傳方法,以實(shí)例的形式詳細(xì)講述了文件上傳類的實(shí)現(xiàn)以及具體功能講解,非常實(shí)用,需要的朋友可以參考下2014-10-10
PHP使用流包裝器實(shí)現(xiàn)WebShell的方法
這篇文章主要介紹了PHP使用流包裝器實(shí)現(xiàn)WebShell的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
yii2 commands模式以及配置crontab定時(shí)任務(wù)的方法
下面小編就為大家?guī)硪黄獃ii2 commands模式以及配置crontab定時(shí)任務(wù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
PHP判斷字符串長(zhǎng)度的兩種方法很實(shí)用
這篇文章主要介紹了PHP判斷字符串長(zhǎng)度的相關(guān)資料,需要的朋友可以參考下2015-09-09

