中间件
作用
就是在访问实际的控制器与方法之前,首先访问中间件,我感觉我曾经想到的一个比喻是很贴切的,中间件就是女方的父母,在你准备结婚(访问实际的控制器和方法)之前,如果女方有父母,那么你一定要先见见她父母,这就是中间件。
Laravel
内置了几个中间件,下面会介绍,但是首先来看如何自定义一个中间件。
命令行创建
Laravel
有一点很爽的就是可以使用命令行来直接生成基础代码的文件,详细的我会专门列一个表格出来的,现在先来看创建中间件的文件。
在项目的根目录下,也就是artisan
的那个目录下,可以运行下面的命令新建一个中间件文件:
php artisan make:middleware MiddlewareName
接着就会在\app\Http\Middleware
下新建了一个MiddlewareName.php
的文件,这里直接贴基础代码吧,如果不想使用命令行,那么就手动新建一个文件,把下面的代码复制进去就行了:
<?php
namespace App\Http\Middleware;
use Closure;
class MiddlewareName
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//这里存放中间件验证之前执行的代码
$response=$next($request);
//这里存放经过中间件验证之后执行的代码
return $response;
}
}
注册中间件
上面我们只是把中间件的文件创建好了,之后如果想要调用该中间件,则需要对该中间件进行注册,注册的方法很简单,需要设置\app\Http\Kernel.php
文件。具体各个部分的作用直接看下面代码中的注释:
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
这个是全局的中间件,每个路由都会经过其中中间件的验证
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
这里是一组,就是按照你的意愿,把多个中间件组合在一起,这样调用起来比较方便
*/
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',
],
// 'checkage'=>[\App\Http\Middleware\CheckAge::class]
];
/**
上面是一组,那么这里就是单个的中间件了,如果你想你的中间件单独生效,那就在这里进行注册
*/
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,
];
}
调用中间件
路由中直接调用
Route::get('users/1',function(){})->middleware('auth');
上面直接调用了一个中间件auth
,至于这个中间件的具体作用暂且不谈,现在只需要确定是这样在路由中调用中间件的即可。
可以调用多个中间件:
Route::get('users/1',function(){})->middleware('auth','second','third');
会把请求依次按照上面的顺序进行检验。这里也可以直接传入中间件组的名称,调用中间件组和单一中间件的方法是一样的。
参数设置
首先,我们使用命令行创建出来的基础中间件,默认传入的参数是两个,$request
和Closure $next
,但是实际上自定义的类并没有继承和扩展任何类,所以完全是我们自定义了一个类,并在该类中设置了统一的方法:handle
,所以我们完全可以在其中加入新的参数,来满足我们自己的需要:
public function handle($request,Closure $next,$newParam){
//如果确定按照请求征程执行,则运行下面的代码
return $next($request);
//否则你可以直接把页面重定向
redirect()->route('routeName');
}
回到路由调用中间件中来,当你设置额外的参数时,可以在路由调用中间件时传入:
Route::put('post/{id}',function($id){})->middleware('role:paramFirst,paramSecond');
在中间件名字的后面加上:
表示接下来的是参数,多个参数之间使用,
进行分割。
控制器调用中间件
可以看我这篇文章Laravel 验证