Laravel框架中引入了“中間件”這個概念,筆者覺得不是太合適。這里的Middleware和Java Servlet中的過濾器(Filter)就是一個東西,但是想比之下Filter這個詞更容易理解一些。當然,為了入鄉隨俗,我們在這里也稱這東西為“中間件”。
中間件的作用其實很簡單,很明了:在業務行為之前先做點事情(前中間件)-->執行業務行為-->再做點其它事件(后中間件)。讓我們來張靈魂畫圖:
所以,我們現在需要解決下面兩個問題:創建和配置。
1、中間件的創建
在項目根目錄下,執行php artisan make:middleware TestMidWare,就可以在/app/Http/Middleware下就自動生成了一個TestMidWare.php文件,里面有個TestMidWare類,原始代碼如下:
2、中間件的使用
既然現在中間件類已經創建出來了,我們就開始討論怎么讓這個類生效。注冊中間件,讓中間件起作用,我們在這里討論兩種很常見的方式:全局中間件 和 路由中間件。
無論是哪一種中間件,都要在/app/Http/Kernel.php中注冊,才可以生效。
(1) 全局中間件
Kernel.php文件中有一個名為$middleware的數組,只要將我們的中間件類(例上上面的TestMidWare)寫在這個數組中,就會對所有的業務流程生效,如下圖:
(2)路由中間件
在Kernel.php文件中有一個名為$routeMiddleware的數組,將中間件類寫在這個數組中(要以key=>value的形式),並且在路由中指定,就可以生效,如下圖:
接着,我們在路由中指定這個中間件:
這時當我們訪問http://域名/hello/id的時候,在MyController@hello的業務生效前后,CrossDomain中間件就會起作用。
3、前/后中間件
無論是前中間件還是后中間件,本質都是中間件,創建和注冊的方法都完全一樣。只是代碼在中間件類里的位置不一樣而已。一個中間件可以同時是前中間件和后中間件。代碼如下所示:
namespace App\Http\Middleware; use Closure; class TestMidWare { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { //A 前中間件代碼 $response=$next($request); //業務流程,流轉到下一個中間件,或者業務處理函數 //B 后中間件代碼 return $response; } }
代碼寫在A部分,這個中間件就是前中間件;代碼寫在B部分,這個中間件就是后中間件;如果A和B兩個部分都寫,那么這個中間件既是前中間件,也是后中間件。
4、其他
到了這里,中間件的使用方法就告一段落了。下面舉個中間件使用的例子,我的代碼需要實現跨域,所有的API響應之前都要輸出跨域的header,所以我選用了中間件來處理:
<?php namespace App\Http\Middleware; use Closure; class CrossDomain { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response=$next($request); $response->header('Access-Control-Allow-Origin', "*"); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN'); $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'true'); return $response; } }
中間件的話題到這里結束,上面是最最常用的中間件知識點。當然,中間件還有其他的話題:中間件組、終端中間件、中間件參數,這些大家就參考官方手冊吧。
下回見咯:)
--------------------------- 我是可愛的分割線 ----------------------------
最后博主借地宣傳一下,漳州編程小組招新了,這是一個面向漳州青少年信息學/軟件設計的學習小組,有意向的同學點擊鏈接,聯系我吧。