(學習筆記) Laravel 中介軟體
(學習筆記)laravel 中介軟體
laravel的請求在進入邏輯處理之前會通過http中介軟體進行處理。
也就是說http請求的邏輯是這樣的:
建立中介軟體
首先,通過Artisan命令建立一箇中間件。
php artisan make:middleware [中介軟體名稱]
例如我建立一個叫做 TestMiddleware的中介軟體。
php artisan make:middleware TestMiddleware
這樣我們就會在app/http/middleware目錄下看到我們在建立的中介軟體
註冊中介軟體
中介軟體可以是針對route的也可以是針對所有http請求的。
在註冊中介軟體時這兩種有一定不同。
針對都有http請求
如果中介軟體在每一個HTTP請求期間都被執行,只需要將相應的中介軟體類設定到 app/Http/Kernel.php 的陣列屬性 $middleware 中即可。
如下:
protected $middleware = [
//這是自帶的例子
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
//這是我註冊的中介軟體
\App\Http\Middleware\TestMiddleware::class,
] ;
針對特定route
對於針對特定route的中介軟體。
app/Http/Kernel.php 類的 $routeMiddleware 屬性包含了 Laravel 內建的入口中介軟體,在其中新增你自己的中介軟體只需要將其追加到後面併為其分配一個簡寫的key:
protected $routeMiddleware = [
//這是自帶的例子
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware \AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
//這是我註冊的中介軟體
'test' => \App\Http\Middleware\TestMiddleware::class,
];
在註冊完中介軟體後就要開始繫結中介軟體到route。
繫結route有兩種方法。
第一種是通過陣列分配
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
第二種是通過方法鏈來分配
Route::get('/', function () {
//
})->middleware(['first', 'second']);
同時,也可以在Controller中呼叫中介軟體,就是在Controller的構造方法中呼叫:
//Controller的構造方法
public function __construct()
{
//呼叫中介軟體
$this->middleware('test');
}
這樣我們就能使用中介軟體了
中介軟體程式碼分析
中介軟體可以實現啊很多功能,例如許可權驗證,訪問記錄,重定向等等。
具體幹什麼看自己想法。
中介軟體在請求階段會呼叫自己的handle()方法
同時中介軟體也可以在響應階段使用,這時,會掉用它的terminate()方法。
所以,當需要在響應發出後使用中介軟體只需要重寫terminate()方法即可。
<?php
namespace App\Http\Middleware;
use Closure;
class TestMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
//這裡是響應後呼叫的方法
}
}
handle()方法
handle()方法有兩個引數
$request
—>請求資訊,裡面包含了輸入,URL,上傳檔案等等資訊。
$next
—>閉包函式。我的理解是將接下來需要執行的邏輯裝載到了其中。
返回值:
通過上文對引數的描述可以瞭解到:
當我們在中介軟體中return $next($request);
時,相當與把請求傳入接下來的邏輯中。
同時,中介軟體也可以返回重定向,不執行之前的邏輯。
例如,希望將頁面重定向到’/welcome’的頁面return redirect('welcome')
.
注意,這裡是重定向到”/welcome”這個地址的route而不是”welcome”這個頁面(view)。
terminate()方法
引數
$request
—>請求資訊,裡面包含了輸入,URL,上傳檔案等等資訊。
$response
–>響應訊息,包含了邏輯處理完成後傳出到的響應訊息。
因為terminate()方法只是在響應後進行一些處理所以沒有返回值。