【Fizzday02】構建顯式路由分發(fā)網絡, 完善框架結構

萬丈高樓平地起, 再判颍框架路由始

通過這句話, 就可以看出路由的作用有多大.
由于過往接觸的框架(如: CodeIgniter(CI3.x), ThinkPHP(TP3.x)) 的路由默認都是隱式的, 何為"隱式", 簡單的講就是"隱藏"起來了(自動路由), 我們直接使用, 不用去管路由. 所以, 造成很多人對路由的概念有點模糊. 在這里, 我準備把路由給顯化出來, 何為"顯化", 請看如下所示:

<?php
/**
 * get 請求地址:
 * @api: /
 */
Route::get('/', function(){
    echo 'fizzday route test';
});

/**
 * post 請求地址: doman.com/test, 對應的是 `TestController` 的 `index` 方法
 * @api: /test/index
 */
Route::post('test', 'TestController@index');

/**
 * get 或 post 都可以
 */
Route::any('test/test2', 'TestController@test2');

/**
 * 路由組
 * @api /admin
 */
Route::group('admin', function(){
    /**
     * 路由組
     * @api /admin/test/getNews
     */
    Route::post('test/getNews', 'admin\TestController@getNews');

    Route::post('test', 'admin\TestController@index');
});

先過過眼癮, 這種路由是不是有一種很眼熟的感覺, 沒錯, 他就是大名鼎鼎的 Laravel 所采用的路由格式, 那是不是意味著, 我們可以直接使用 Laravel 的路由了? 其實, 當我看了下 Laravel 的路由后, 就沒有想使用的欲望了, 那個又大又復雜, 對于我們交流和 DIY 有著太多的不便.
沒錯, 是 DIY , 因為我的目標就是打造一個簡單快捷, 人人都可以 DIY 的強悍框架. 所以, 我會用盡可能少的代碼, 做到目前盡可能前衛(wèi)的使用.
當然, 前輩都有走過這條路, 所以, 還是值得借鑒一番的, 這不有一個mini型的 noahbuscher/Macaw, 還有我們非常勤勞與和善的 lvwenhan 先輩的 TinyRouter , 就是在此基礎之上改進的. 那是不是意味著, 我也可以直接使用了???
可是, 盡管他是如此的mini, 還是有了改良版的 TinyRouter , 具體改進, 請看源碼, 然而, TinyRouter 會是我們想要的類型么, 其實, 遺憾的發(fā)現, 也不盡然, 不能做到我們想要的這種類型, 至少還缺少這個一目了然的 group. 所以, 就有了這個 FizzRoute 的誕生:

為啥要用這個"顯式"路由

到底為啥呢? 因為這個好處, 有很多很多, 到底有多少, 我就不一一細說了, 只說一點, 現在的 api 大行其道, 其中有一點就是, 我們的接口到底有多少? 接口的參數神馬的, 都是啥? 接口的傳遞方式又是啥? ....... 這一問, 可咋辦, 這不, 顯式路由的威力就體現出來了, 我通過路由的注釋文檔, 一目了然的就體現出來了.....

FizzRoute - 簡單強悍的路由

下邊就看我們如何放大招, 來搞定他了:
我依然借鑒了上邊的 Route 的部分, 然后做了部分改進, 路由很簡潔, 不足200行, 只有幾個重要方法:

// 過濾
filter();

// 捕獲靜態(tài)方法
__callstatic();

// 路由核心處理
dispath();

// 分配控制器
matchController();

具體請看源碼: fizzday/fizzRoute

為了省事, 也加入了自動路由, 這樣, 即可以手動指定路由對應的文件, 未定義時還可以自動找到

路由分配, 結構完善

好了, 路由有了, 我們需要給他分配個位置, 因為經常會用到, 我們就把他放入根目錄吧, 比較好找, 并命名為 routes, 這樣可以在他下邊放路由文件了
FizzRoute 類, 我們需要給他放入框架 Fizzday 核心類中, 屬于框架的一部分. 可是框架目錄也沒有, 因為 , 到時候我們會把框架整體作為一個 composer 包來控制, 所以, 沒有給他分配目錄, 需要用到composer管理, 就執(zhí)行一下 composer require fizzday/fizzroute dev-master', 自動安裝到 vendor 目錄下. 這個時候的基本結構應該差不多了, 我們就順便把MVC` 的目錄也加上, 以后就不用操心了, 現在目錄如下:

~
fizzday
|--|--app/
|--|--|--|--Controllers/
|--|--|--|--Models/
|--|--|--|--Views/
|--|--config/
|--|--public/
|--|--|--|-=index.php
|--|--routes/
|--|--|--|-=routes.php
|--|--vendor/
|--|--|--|--composer/
|--|--|--|--fizzday/
|--|--|--|--|--|--fizzroute/
|--|--|--|--|--|--|--src/
|--|--|--|--|--|--|--|-=FizzRoute.php
|--|-=composer.json

這樣是不是清爽多了, 接下來, 我們要實際驗證下路由分發(fā)是否合理

編寫對應的文件

  1. 編輯composer.json文件, 加入psr-4自動加載, 設定命名空間
$ cd ~/fizzday && vi composer.json

加入內容后:

{
    "name": "Fizzday/Fizzday",
    "description": "A freedom and wonderful PHP Framework based on Composer",
    "keywords": ["fizzday", "freedom", "framework", "php"],
    "license": "MIT",
    "require": {
        "fizzday/fizzroute": "dev-master"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },
    "config": {
        "preferred-install": "dist"
    }
}

定義了框架 app 目錄的命名空間為\App

  1. 編輯我們的入口文件:
$ cd ~/fizzday/public && vi index.php

編寫內容如下:

<?php
// 定義路徑常量
define('ROOT_PATH', __DIR__."/");

// 引入composer自動加載文件
require '../vendor/autoload.php';
  1. 編輯路由入口文件:
$ cd ~/fizzday/routes && vi routes.php

編寫內容如下:

<?php
use Fizzday\Routing\FizzRoute as Route;
Route::get('/', 'TestController@index');
  1. 編寫對應的控制器的內容
$ cd ~/fizzday/app/Controllers && vi TestController.php

添加如下內容:

<?php
namespace App\Controller;
class TestControlelr
{
    public function index()
    {
        echo "Fizzday's route success";
    }
}

然后我們訪問: fizzday.com , 發(fā)現居然什么都沒有, 難道是我們的程序出錯了? 貌似過程沒啥問題, 哈哈, 其實, 我們引入了命名空間, 所以, 必須要讓入口文件知道我在命名空間中, 于是乎, 執(zhí)行composer 更新命令:

$ cd ~/fizzday && composer dump-autoload

繼續(xù)訪問: fizzday.com
Hooray ! It works ~~~

Route_success.png

完美手工~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末腮猖,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子赞枕,更是在濱河造成了極大的恐慌坪创,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莱预,死亡現場離奇詭異,居然都是意外死亡依沮,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門危喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人州疾,你說我怎么就攤上這事⊙媳停” “怎么了薄嫡?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵颗胡,是天一觀的道長。 經常有香客問我毒姨,道長哑蔫,這世上最難降的妖魔是什么手素? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任鸳址,我火速辦了婚禮泉懦,結果婚禮上,老公的妹妹穿的比我還像新娘崩哩。我一直安慰自己,他們只是感情好言沐,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著险胰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪起便。 梳的紋絲不亂的頭發(fā)上棚贾,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音妙痹,去河邊找鬼。 笑死怯伊,一個胖子當著我的面吹牛琳轿,可吹牛的內容都是我干的耿芹。 我是一名探鬼主播崭篡,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吧秕,長吁一口氣:“原來是場噩夢啊……” “哼媚送!你這毒婦竟也來了寇甸?” 一聲冷哼從身側響起塘偎,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拿霉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绽淘,有當地人在樹林里發(fā)現了一具尸體涵防,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡沪铭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了杀怠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椰憋。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赔退,死狀恐怖橙依,靈堂內的尸體忽然破棺而出硕旗,到底是詐尸還是另有隱情窗骑,我是刑警寧澤漆枚,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布创译,位于F島的核電站墙基,受9級特大地震影響软族,放射性物質發(fā)生泄漏辛藻。R本人自食惡果不足惜互订,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仰禽。 院中可真熱鬧氮墨,春花似錦吐葵、人聲如沸规揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奸忽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揖庄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工蹄梢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禁炒。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓而咆,卻偏偏與公主長得像幕袱,于是被迫代替她去往敵國和親暴备。 傳聞我的和親對象是個殘疾皇子凹蜂,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容