Laravel中间件提供了一种方便的机制来过滤进入您的应用程序的HTTP请求。例如,Laravel内置了用于验证用户身份验证的中间件。如果用户未通过身份验证,中间件会将用户重定向到登录屏幕。但是,如果用户通过身份验证,中间件将允许请求进一步进入应用程序。所有中间件都位于app/Http/Middleware目录下:创建中间件使用make:middleware命令创建一个新的中间件phpartisanmake:middlewareCheckAge#CheckAge表示中间件文件名。此命令将在app/Http/Middleware目录中创建一个新的CheckAge类。在这个中间件中,我们只允许参数id大于200的请求访问这个路由。否则,我们将用户重定向到homeid<=200){returnredirect('home');}}返回$next($request);}}二:前中间件和后中间件中间件运行在request之前还是之后取决于中间件本身1:前中间件\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::类,'throttle'=>\Illuminate\Routing\Middleware\ThrottleRequests::class,'已验证'=>\Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,];一旦在内核中定义了中间件,就可以使用中间件方法将中间件分配给路由Route::get('admin/profile',function(){//})->middleware('auth');也可以给路由分配多个中间件Route::get('/',function(){//})->middleware('first','second');分配中间件时,您还可以使用App\Http\Midd传递完整的类名leware\CheckAge;Route::get('admin/profile',function(){//})->middleware(CheckAge::class);3:中间件组有时您可能希望使用单个键对多个中间件组件进行分组,以便更容易地分配给路由,可以使用Kernel类的$middlewareGroups属性来实现。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:排序中间件在极少数情况下,您可能需要中间件以特定顺序执行,但是当它们被分配给路由时,您无法控制它们的顺序。在这种情况下,可以使用app/Http/Kernel.php文件的$middlewarePriority属性指定中间件优先级::类,\App\Http\Middleware\Authenticate::类,\Illuminate\Routing\Middleware\ThrottleRequests::类,\Illuminate\Session\Middleware\AuthenticateSession::类,\Illuminate\Routing\Middleware\SubstituteBindings::class,\Illuminate\Auth\Middleware\Authorize::class,];5:中间件参数中间件也可以接受额外的参数。例如,如果您的应用程序需要在运行某些操作之前验证经过身份验证的用户是否具有给定的“角色”,您可以创建一个新的CheckRole中间件,它接受“角色”名称作为附加参数。额外的中间件参数应该在$next参数之后传递:Closure$next*@paramstring$role*@returnmixed*/publicfunctionhandle($request,Closure$next,$role){if(!$request->user()->hasRole($role)){//重定向...}return$next($request);}}定义路由时,通过一个:分隔中间件名称和参数来指定中间件参数。多个参数用逗号分隔Route::put('post/{id}',function($id){//})->middleware('role:editor');6:laravel内置的Terminable中间件“session”中间件在response发送到浏览器后将session数据写入内存。如果你在中间件中定义了一个终止方法,它会在响应发送到浏览器后自动调用
