【Fizzday02】構(gòu)建顯式路由分發(fā)網(wǎng)絡(luò), 完善框架結(jié)構(gòu)

萬丈高樓平地起, 再牛框架路由始

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

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

/**
 * post 請求地址: doman.com/test, 對應(yīng)的是 `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 的路由了? 其實, 當(dāng)我看了下 Laravel 的路由后, 就沒有想使用的欲望了, 那個又大又復(fù)雜, 對于我們交流和 DIY 有著太多的不便.
沒錯, 是 DIY , 因為我的目標(biāo)就是打造一個簡單快捷, 人人都可以 DIY 的強(qiáng)悍框架. 所以, 我會用盡可能少的代碼, 做到目前盡可能前衛(wèi)的使用.
當(dāng)然, 前輩都有走過這條路, 所以, 還是值得借鑒一番的, 這不有一個mini型的 noahbuscher/Macaw, 還有我們非常勤勞與和善的 lvwenhan 先輩的 TinyRouter , 就是在此基礎(chǔ)之上改進(jìn)的. 那是不是意味著, 我也可以直接使用了???
可是, 盡管他是如此的mini, 還是有了改良版的 TinyRouter , 具體改進(jìn), 請看源碼, 然而, TinyRouter 會是我們想要的類型么, 其實, 遺憾的發(fā)現(xiàn), 也不盡然, 不能做到我們想要的這種類型, 至少還缺少這個一目了然的 group. 所以, 就有了這個 FizzRoute 的誕生:

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

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

FizzRoute - 簡單強(qiáng)悍的路由

下邊就看我們?nèi)绾畏糯笳? 來搞定他了:
我依然借鑒了上邊的 Route 的部分, 然后做了部分改進(jìn), 路由很簡潔, 不足200行, 只有幾個重要方法:

// 過濾
filter();

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

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

// 分配控制器
matchController();

具體請看源碼: fizzday/fizzRoute

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

路由分配, 結(jié)構(gòu)完善

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

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

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

編寫對應(yīng)的文件

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

加入內(nèi)容后:

{
    "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

編寫內(nèi)容如下:

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

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

編寫內(nèi)容如下:

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

添加如下內(nèi)容:

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

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

$ cd ~/fizzday && composer dump-autoload

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

Route_success.png

完美手工~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容