PHP的TP框架先不說安全或性能怎么樣,那功能方面確實也比較強大,而且相對其它框架的門檻要低好多,做一些私活項目,那簡直是神器呀,最近做一個小活,用到了這個框架,也是看了一下手冊就邊做邊學了。
在開發中用到了中間件、注入和依賴、門面模式等,這篇文章簡單說下在開發中學到的一點小東西,權當一個自已的學習記錄吧。
先說說中間件,這東西也不是啥多么新鮮和高級的玩樣,在很多框架中都有類似實現的方式,像YII的行為和攔截器什么的,也都是差不多的作用。我覺得更多的是將業務和一些邏輯做了解耦分離,使整個業務更清楚,讓你不會在一個地方寫一大堆代碼。
比如你要控制寫日志、權限認證、來源判斷、白名單、返回Json等你都可以寫在不同的中間件里面,避免了將這些代碼寫到一個地方去判斷,也可以重復利用代碼,所以說,適當用上中間件來寫,還是挺爽的。
在TP中,有好幾種不同類型的中間件,像全局中間件、應用中間件、路由中間件、控制器中間件,它們之間的執行順序也是按上面的來的。
全局中間件
在app/middleware.php
定義的中間件
return [
// Session初始化
\think\middleware\SessionInit::class
];
應用中間件
這個是在應用下面定義的,如我的app目錄下面有 api
,admin
應用,那么在 app/api/middleware.php
定義
return [
\app\api\middleware\Log::class
];
路由中間件
就是在注冊路由時,可以注冊中間件,執行這個路由時,執行相對應的中間件。
Route::post('create-order','app\\api\\controller\\order\OrderPay@createOrder')->middleware(app\\middleware\Auth::class);
控制器中間件
在控制器中定義$middleware屬性,如示例,當訪問index控制時,就會執行中間件
class Index extends FrontController
{
protected $middleware = [ \app\admin\middleware\CheckAdmin::class];
public function index()
{
echo 'test';
}
}
路由
這東西很不錯呀,可以靈活控制你的URL地址顯示,不過是隱藏真實地址,美化地址都能輕易實現,比如我現在這個項目,因為要兼容以前的地址,到時候遷移的時候只想要改域名就行了,所以需要把路徑搞成一樣的。
它以前的項目是用.NET寫的,里面的URL有v1
,v2
這種,這種東西在Net中很簡單,就配置一個注解就行了。
沒想到,這個在TP中也是很容易實現的。通過配置路由就行了。
配置路由
一 TP的路由文件可以配置在/route/[應用]/app.php
或 app/[應用]/app.php
等,如果在應用中配置了,那么 /route
下面就不會執行了。
在 /route/api/app.php
配置路由定義
use think\facade\Route;
Route::group('hpay',function(){
Route::post('create-order','app\\api\\controller\\order\OrderPay@createOrder');
Route::post('query-order','app\\api\\controller\\order\OrderQuery@queryOrder');
});
二 在 config/app.php
里面加一個應用映射
'app_map' => [
Env::get('htpay.version', 'v1') => 'api', //映射,就是把路徑v1這種導到api應用中。
],
上面兩步就可以實現了,這樣你訪問 http://域名/v1/hpay/create-order
v1
就映射到api
應用,hpay/create-order
就能訪問到配置的控制器中了,完美實現,代碼不需要更改任何東西。
不過這里要注意下,上面配置的是 Route::post
,所以只能通過post
的方式來訪問,用其它方式訪問就會訪問不到了,這樣更好,本來想用中間件來限制只能 post
訪問,結果根本都不需要了。
好了,上面就是在開發的時候,用到的一些東西,有后續的學習過程中,如果有什么要記錄的,我還會繼續寫的。