Laravel中間件的使用詳解
Laravel 中間件提供了一種方便的機制來過濾進入應(yīng)用的 HTTP 請求。例如,Laravel 內(nèi)置了一個中間件來驗證用戶的身份認證。如果用戶沒有通過身份認證,中間件會將用戶重定向到登錄界面。但是,如果用戶被認證,中間件將允許該請求進一步進入該應(yīng)用,所有中間件都位于 app/Http/Middleware 目錄下
一:創(chuàng)建中間件
使用 make:middleware 命令來創(chuàng)建新的中間件
php artisan make:middleware CheckAge #CheckAge表示的是中間件文件名稱
該命令將會在 app/Http/Middleware 目錄內(nèi)新建一個 CheckAge 類
在這個中間件里,我們僅允許提供的參數(shù) id 大于 200 的請求訪問該路由。否則,我們會將用戶重定向到 home
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
* 處理傳入的請求
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->id<= 200) {
return redirect('home');
}
return $next($request);
}
}二:前置和后置中間件
中間件是在請求之前或之后運行取決于中間件本身
1:前置中間件
<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// 執(zhí)行動作
return $next($request);
}
}
2:后置中間件
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 執(zhí)行動作
return $response;
}
}
三:注冊中間件
1:注冊全局中間件
如果你想讓中間件在你應(yīng)用的每個 HTTP 請求期間運行,只需在 app/Http/Kernel.php 類中的 $middleware 屬性里列出這個中間件類
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
2:為路由分配中間件
如果想為指定的路由配置中間件,首先應(yīng)該在 app/Http/Kernel.php 文件內(nèi)為該中間件指定一個鍵。默認情況下,Kernel 類的 $routeMiddleware 屬性包含 Laravel 內(nèi)置的中間件條目。要加入自定義的,只需把它附加到列表后并為其分配一個自定義鍵即可
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
一旦在 Kernel 中定義了中間件,就可使用 middleware 方法將中間件分配給路由
Route::get('admin/profile', function () {
//
})->middleware('auth');
你還可以為路由分配多個中間件
Route::get('/', function () {
//
})->middleware('first', 'second');
分配中間件時,你還可以傳遞完整的類名
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
3:中間件組
有時你可能想用單一的鍵為幾個中間件分組,使其更容易分配到路由??梢允褂?Kernel 類的 $middlewareGroups 屬性來實現(xiàn)
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];可以使用與單個中間件相同的語法將中間件組分配給路由和控制器操作
Route::get('/', function () {
//
})->middleware('web');
Route::group(['middleware' => ['web']], function () {
//
});
4:排序中間件
很少情況下,你可能需要中間件以特定的順序執(zhí)行,但是當它們被分配到路由時,你無法控制它們的順序。在這種情況下,可以使用 app/Http/Kernel.php 文件的 $middlewarePriority 屬性指定中間件優(yōu)先級
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
5:中間件參數(shù)
中間件也可以接受額外的參數(shù)。例如,如果應(yīng)用需要在運行特定操作前驗證經(jīng)過身份認證的用戶是否具備給定的「角色」,你可以新建一個 CheckRole 中間件,由它來接收「角色」名稱作為附加參數(shù)。
附加的中間件參數(shù)應(yīng)該在 $next 參數(shù)之后被傳遞:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
/**
* 處理傳入的請求
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// 重定向...
}
return $next($request);
}
}定義路由時通過一個 : 來隔開中間件名稱和參數(shù)來指定中間件參數(shù)。多個參數(shù)就使用逗號分隔
Route::put('post/{id}', function ($id) {
//
})->middleware('role:editor');
6:Terminable 中間件
laravel 內(nèi)置的「session」中間件會在響應(yīng)發(fā)送到瀏覽器之后將會話數(shù)據(jù)寫入存儲器中。如果你在中間件中定義一個 terminate 方法,則會在響應(yīng)發(fā)送到瀏覽器后自動調(diào)用
<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// Store the session data...
}
}
terminate 方法應(yīng)該同時接收和響應(yīng)。一旦定義了這個中間件,你應(yīng)該將它添加到路由列表或 app/Http/Kernel.php 文件的全局中間件中
在你的中間件上調(diào)用 terminate 調(diào)用時,Laravel 會從 服務(wù)容器 中解析出一個新的中間件實例。如果要在調(diào)用 handle 和 terminate 方法時使用同一個中間件實例,就使用容器的 singleton 方法向容器注冊中間件
到此這篇關(guān)于Laravel中間件的使用詳解的文章就介紹到這了,更多相關(guān)Laravel中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用php數(shù)據(jù)緩存技術(shù)提高執(zhí)行效率
使用php緩存技術(shù)時為了提高效率。在大量的并發(fā)訪問面前,獲取數(shù)據(jù)可能成為效率的瓶頸,PHP實際開發(fā)之中針對數(shù)據(jù)處理進行緩存。2022-12-12
php 根據(jù)url自動生成縮略圖并處理高并發(fā)問題
服務(wù)器生成縮略圖的時機一般分為兩種:上傳文件時生成、訪問時生成,下面為大家介紹下php根據(jù)url自動生成縮略圖并處理高并發(fā)問題2014-01-01
php中magic_quotes_gpc對unserialize的影響分析
這篇文章主要介紹了php中magic_quotes_gpc對unserialize的影響,以實例的形式分析了magic_quotes_gpc安全過濾對unserialize造成的影響以及對此的解決方法,非常具有實用價值,需要的朋友可以參考下2014-12-12

