Laravel框架中簡單使用中介軟體
簡介
HTTP 中介軟體提供一個方便的機制來過濾進入應用程式的 HTTP 請求,例如,Laravel 預設包含了一箇中間件來檢驗使用者身份驗證,如果使用者沒有經過身份驗證,中介軟體會將使用者導向登入頁面,然而,如果使用者通過身份驗證,中介軟體將會允許這個請求進一步繼續前進。
當然,除了身份驗證之外,中介軟體也可以被用來執行各式各樣的任務,CORS
中介軟體負責替所有即將離開程式的響應加入適當的響應頭,一個日誌中介軟體可以記錄所有傳入應用程式的請求。 Laravel 框架已經內建一些中介軟體,包括維護、身份驗證、CSRF 保護,等等。所有的中介軟體都位於 app/Http/Middleware 目錄內。
建立中介軟體
要建立一個新的中介軟體,可以使用 make:middleware 這個 Artisan 命令:
php artisan make:middleware privilege(中介軟體名稱)
此命令將會 在 app/Http/Middleware 目錄內建立一個名稱為 privilege的類。在這個中介軟體內我們只允許 年齡 大於 200 的才能訪問路由,否則,我們會將使用者重新導向 「home」 的 URI 。
<?php
namespace App\Http\Middleware;
use Closure;
class privilege{
/**
*Handle an incoming request.
*
*@param \Illuminate\Http\Request $request
*@param \Closure $next
*@return mixed
*/
public function handle($request, Closure $next) {
if ($request->input('age') < 200) {
return redirect('home');
}
return$next($request);
}
}
如你所見,若是
年齡 小於 200 ,中介軟體將會返回 HTTP 重定向給客戶端,否則,請求將會進一步傳遞到應用程式。只需呼叫帶有
$request 的$
註冊中介軟體
全域性中介軟體
若是希望中介軟體被所有的 HTTP 請求給執行,只要將中介軟體的類加入到 app/Http/Kernel.php 的 $middleware 屬性清單列表中。
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];
/**
* The application's route middleware.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'privilege' => \App\Http\Middleware\privilege::class,
];
}
指派中介軟體給路由
如果你要指派中介軟體給特定的路由,你得先將中介軟體在 app/Http/Kernel.php 配置一個鍵值,預設情況下,這個檔案內的 $routeMiddleware 屬性已包含了 Laravel 目前配置的中介軟體,你只需要在清單列表中加上一組自定義的鍵值即可。 中介軟體一旦在 HTTP kernel 檔案內被定義,你即可在路由選項內使用 middleware 鍵值來指派:
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];
/**
* The application's route middleware.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'privilege' => \App\Http\Middleware\privilege::class,
];
}