在了解一些基礎(chǔ)的laravel知識(shí)后,可以試著去了解laravel一些功能強(qiáng)大并且特有的知識(shí)點(diǎn),比如中間件,那么官方給它的定義是:HTTP 中間件為過(guò)濾訪問(wèn)你的應(yīng)用的 HTTP 請(qǐng)求提供了一個(gè)方便的機(jī)制。例如,Laravel 默認(rèn)包含了一個(gè)驗(yàn)證用戶的中間件。如果沒(méi)有經(jīng)過(guò)身份驗(yàn)證,中間件將會(huì)將用戶重定向至登錄頁(yè)面。然而,如果用戶經(jīng)過(guò)了驗(yàn)證,中間件將會(huì)允許請(qǐng)求繼續(xù)在應(yīng)用中執(zhí)行下去。個(gè)人理解是,中間件就是放到方法前和方法后去執(zhí)行,然后影響執(zhí)行的效果.
那么laravel中的中間件事定義在哪里呢?
app\http\Middleware我們定義的中間件是在這個(gè)目錄下,那么中間件除了有影響方法的效果,還有什么樣的機(jī)制呢??
定義中間件
既然使用中間件,就必須去定義,那么怎么去定義呢?
之前了解過(guò)artisan工具,那么它是否可以幫助我們呢?
php artisan make:middleware EmailMiddleware
這樣的一條命令即可,執(zhí)行之后會(huì)在定義的目錄下多出一個(gè)EmailMiddleware的中間件
<?php
namespace App\Http\Middleware;
use Closure;
class Emailmiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
以上的php文件就是中間件的內(nèi)容,只有一個(gè)方法,handle里面的兩個(gè)參數(shù),一個(gè)是request對(duì)象,那么在laravel中是一個(gè)請(qǐng)求的意思,同樣的還有一個(gè)$next方法,直接return,個(gè)人理解就是用next方法去處理在路由中的請(qǐng)求信息
可能大家會(huì)有疑問(wèn),中間件就這么點(diǎn)東西么?不是的
現(xiàn)在只是定義了中間件,如何去使用呢?
注冊(cè)中間件
最簡(jiǎn)單的方法是在路由中或控制器中去使用
- 注冊(cè)中間件到路由
//app/routes.php
Route::get('test',['middleware'=>'App\Http\Middleware\EmailMiddleware',function(){
echo 'hello';
}])
//app\http\Middleware\EmailMiddleware
public function handle($request, Closure $next)
{
$rs = $next($request);
echo 'world';
return $rs;
}
運(yùn)行test這個(gè)action給response的是
hello world
但是在路由中請(qǐng)求信息是hello,為什么給返回的是hello world呢,這就是中間件起到的作用,我們?cè)谡?qǐng)求信息之后,執(zhí)行了一個(gè) echo world的響應(yīng)信息,這是中間件的簡(jiǎn)單應(yīng)用
剛才呢,是把中間件注冊(cè)到基礎(chǔ)路由上,如果注冊(cè)到控制器路由呢,應(yīng)該怎么樣去使用
- 注冊(cè)中間件到控制器路由
Route::get('index',['middleware'=>'App\Http\Middleware
\EmailMiddleware','uses'=>'IndexController']);
把中間注冊(cè)到控制器路由上,與基礎(chǔ)路由有一定的區(qū)別,

這些呢是一些非常簡(jiǎn)單的中間件使用,直接在路由中去注冊(cè)然后使用
去laravel做過(guò)項(xiàng)目的同學(xué)可能都知道,每當(dāng)去post的提交的時(shí)候,就會(huì)報(bào)一個(gè)Token的錯(cuò)誤,那這個(gè)錯(cuò)誤,為什么每次去post的提交都會(huì)報(bào)錯(cuò)呢,仔細(xì)去看,在app\http\middleware下有個(gè)VerifyCsrfToken.php這樣的中間件,然后laravel官方呢把這個(gè)中間件給注冊(cè)到全局上,就是app\Kernel.php
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,//token的驗(yàn)證
];
//在路由中聲明的中間件
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
每當(dāng)我們?nèi)ヌ峤坏臅r(shí)候就會(huì)報(bào)token的錯(cuò)誤
所以呢,我們也可以把中間件給注冊(cè)到Kerner.php中,如
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'Email' => \App\Http\Middleware\EmailMiddleware::class,//新聲明的中間件
];
在路由中調(diào)用這樣就可以了,如
Route::get('test',['middleware'=>'Email',function(){
echo 'hello';
}]);
這些呢就是中間件的使用,歡迎學(xué)習(xí)!!!