萬丈高樓平地起, 再判颍框架路由始
通過這句話, 就可以看出路由的作用有多大.
由于過往接觸的框架(如: 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ā)是否合理
編寫對應的文件
- 編輯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
- 編輯我們的入口文件:
$ cd ~/fizzday/public && vi index.php
編寫內容如下:
<?php
// 定義路徑常量
define('ROOT_PATH', __DIR__."/");
// 引入composer自動加載文件
require '../vendor/autoload.php';
- 編輯路由入口文件:
$ cd ~/fizzday/routes && vi routes.php
編寫內容如下:
<?php
use Fizzday\Routing\FizzRoute as Route;
Route::get('/', 'TestController@index');
- 編寫對應的控制器的內容
$ 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 ~~~
完美手工~~~