Laravel5.3使用學習筆記---中介軟體
Laravel提供了中介軟體的使用。那什麼是中介軟體呢,根據用法,我總結為,夾在“請求—>控制器—>響應—>end”中間執行的程式碼片段。本文將以官方英文文字為基礎資料進行筆記記錄。
Laravel V5.3 middleware : https://laravel-china.org/docs/en/5.3/middleware
一. 使用入門
本人覺得常用的就是在”請求–>控制器”這個流程中插入中間執行程式碼。
首先,需要建立中介軟體,如:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Test
{
public function handle($request, Closure $next, $guard = null)
{
echo "this is middleware named test <br/>";
return $next($request);
}
}
注意這裡需要執行的程式碼放在 handle方法中,該方法的形參中的“$request”是請求類,”$next”是流水線(流水線式laravel框架的一個核心流程概念,有興趣可去看原始碼,裡面的類叫pipeLine)中下一個需要執行的閉包函式。
然後,就是為自己定義的路由註冊中介軟體,在app/Http/Kernel.php中,寫上如下程式碼:
(注意:以下用法中介軟體在控制器例項之後,具體行為之前執行)
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware \RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'test_mid' => \App\Http\Middleware\Test::class, //在後面新增自己自定義的中介軟體
];
最後,就是在路由的定義那裡使用middleware方法進行繫結:
Route::get('/', function () {
return "hello <br/>";
})->middleware('test_mid');
配置完了,當在瀏覽器中輸入如下網址時:
http://Host/
於是,就輸出:
this is middleware named test
hello
二. 結尾中介軟體(Terminable Middleware)
在控制器前可以新增中介軟體,那麼再控制器後也可以新增結尾中介軟體,使用相當簡單,就是在自定義中介軟體裡定義terminate函式,如下:
(注意:以下用法中介軟體在控制器行為之後執行)
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Test
{
public function handle($request, Closure $next, $guard = null)
{
echo "this is middleware named test <br/>";
return $next($request);
}
public function terminate($request, $response)
{
echo "this is terminate middleware named test <br/>";
}
}
其它步驟和“一”中說的一致,然後輸入網址後,輸出:
this is middleware named test
hello
this is terminate middleware named test
三. 中介軟體更加靈活的用法
如果希望所有路由都執行同一個自定義中介軟體,就在app/Http/Kernel.php中的middleware 陣列新增自定義項,如:
(注意:以下用法中介軟體在控制器例項化之前執行)
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\Test::class,
];
或者,希望一個路由能夠同時使用多箇中間件,就在app/Http/Kernel.php中的middlewareGroups陣列新增自定義項,如:
protected $middlewareGroups = [
'testMG' => [
\App\Http\Middleware\Test::class,
中介軟體2,
中介軟體3
]
];
然後,在路由定義時,如下使用:
Route::get('/', function () {
return "hello <br/>";
})->middleware('testMG');
或者,希望某個路由在使用中介軟體時,能攜帶一個引數(目前只支援一個字串引數【json時就可以表示物件了】),就要在路由定義時,如下使用:
Route::get('/', function () {
return "hello <br/>";
})->middleware('test:myParams'); //冒號前就是註冊的中介軟體的名字,冒號後就是引數了
然後,中介軟體的handle函式中,第三個形參,就是用來接收“myParams”這個傳遞過來的字串的。
或者如果想再控制器中定義中介軟體,可以在控制器的建構函式中這樣寫:
class TestController extends Controller{
public function __construct()
{
$this->middleware('中介軟體名字1');
$this->middleware('中介軟體名字2');
}
}