Laravel 5.0 - Middleware (中间件)
2019獨角獸企業重金招聘Python工程師標準>>>
圖片:http://stackphp.com/
如上圖所示,中心的綠色區域是整個應用的核心區域。
所以,中間件就是一系列處理請求和響應的方式而不是你用程序邏輯的一部分。
Laravel 中默認使用中間件處理請求中的加密解密,以及 Cookies 和 Sessions。你也可以自定義自己所需的中間件。
寫中間件
artisan make:middleware MyMiddleware
執行上面的命令,生成中間件文件:
<?php?namespace?App\Http\Middleware;use?Closure; use?Illuminate\Contracts\Routing\Middleware;class?MyMiddleware?implements?Middleware?{/***?Handle?an?incoming?request.**?@param??\Illuminate\Http\Request??$request*?@param??\Closure??$next*?@return?mixed*/public?function?handle($request,?Closure?$next){//}}完善 handle 方法的內容(用請求端口來做個例子):
<?php?namespace?App\Http\Middleware;use?Closure; use?Illuminate\Contracts\Routing\Middleware;class?MyMiddleware?implements?Middleware?{/***?Handle?an?incoming?request.**?@param??\Illuminate\Http\Request??$request*?@param??\Closure??$next*?@return?mixed*/public?function?handle($request,?Closure?$next){//?Test?for?an?even?vs.?odd?remote?portif?(($request->server->get('REMOTE_PORT')?/?2)?%?2?>?0){throw?new?\Exception("WE?DON'T?LIKE?ODD?REMOTE?PORTS");}return?$next($request);}}使用中間件
Laravel 5 中有兩種方法加入中間件,都是寫在 App\Providers\AppServiceProvider。
默認有兩個屬性 $middleware 和 $stack ,$stack 里面的中間件是每次響應都會處理,而 $middleware 中的中間件是按需處理。
一幫情況下默認的中間件如下:
protected?$stack?=?['App\Http\Middleware\MaintenanceMiddleware','Illuminate\Cookie\Middleware\Guard','Illuminate\Cookie\Middleware\Queue','Illuminate\Session\Middleware\Reader','Illuminate\Session\Middleware\Writer',];protected?$middleware?=?['auth'?=?'App\Http\Middleware\AuthMiddleware','auth.basic'?=>?'App\Http\Middleware\BasicAuthMiddleware','csrf'?=>?'App\Http\Middleware\CsrfMiddleware','guest'?=>?'App\Http\Middleware\GuestMiddleware',];中間件每次請求都處理:
protected?$stack?=?['App\Http\Middleware\MyMiddleware''App\Http\Middleware\MaintenanceMiddleware','Illuminate\Cookie\Middleware\Guard','Illuminate\Cookie\Middleware\Queue','Illuminate\Session\Middleware\Reader','Illuminate\Session\Middleware\Writer',];中間件按需處理:
?protected?$middleware?=?['auth'?=>?'App\Http\Middleware\AuthMiddleware','auth.basic'?=>?'App\Http\Middleware\BasicAuthMiddleware','csrf'?=>?'App\Http\Middleware\CsrfMiddleware','guest'?=>?'App\Http\Middleware\GuestMiddleware','absurd'?=>?'App\Http\Middleware\MyMiddleware',];中間件路由注釋
直接寫到控制器類:
/***?@Resource("foobar/photos")*?@Middleware("auth")*?@Middleware("absurd",?except={"update"})*?@Middleware("csrf",?only={"index"})*/ class?FoobarPhotosController {}寫到方法:
/***?@Middleware("auth.basic")*/ public?function?index()?{}$this->middleware()
可以在構造函數或者方法內使用 $this->middleware() 來加載相應的中間件。
... use?Illuminate\Routing\Controller;class?AwesomeController?extends?Controller?{public?function?__construct(){$this->middleware('csrf');$this->middleware('auth',?['only'?=>?'update'])}}routes.php 設置中間件
//?Routes.php//?Single?route $router->get("/awesome/sauce",?"AwesomeController@sauce",?['middleware'?=>?'auth']);//?Route?group $router->group(['middleware'?=>?'auth'],?function()?{//?lots?of?routes?that?require?auth?middleware });響應之前和之后處理
應用程序響應之前和之后的中間件處理:
之前處理:
... class?BeforeMiddleware?implements?Middleware?{public?function?handle($request,?Closure?$next){//?Do?Stuffreturn?$next($request);}}之后處理:
... class?AfterMiddleware?implements?Middleware?{public?function?handle($request,?Closure?$next){$response?=?$next($request);//?Do?stuffreturn?$response;}}轉載于:https://my.oschina.net/u/2444569/blog/511719
總結
以上是生活随笔為你收集整理的Laravel 5.0 - Middleware (中间件)的全部內容,希望文章能夠幫你解決所遇到的問題。