javaee论坛

普通会员

225648

帖子

352

回复

366

积分

楼主
发表于 2017-07-19 16:13:10 | 查看: 167 | 回复: 2
就是在访问实际的控制器与方法之前,首先访问中间件,我感觉我曾经想到的一个比喻是很贴切的,中间件就是女方的父母,在你准备结婚(访问实际的控制器和方法)之前,如果女方有父母,那么你一定要先见见她父母,这就是中间件。

Laravel内置了几个中间件,下面会介绍,但是首先来看如何自定义一个中间件。

命令行创建

Laravel有一点很爽的就是可以使用命令行来直接生成基础代码的文件,详细的我会专门列一个表格出来的,现在先来看创建中间件的文件。

在项目的根目录下,也就是artisan的那个目录下,可以运行下面的命令新建一个中间件文件:

php artisan make:middleware MiddlewareName

接着就会在\app\Http\Middleware下新建了一个MiddlewareName.php的文件,这里直接贴基础代码吧,如果不想使用命令行,那么就手动新建一个文件,把下面的代码复制进去就行了:

<?phpnamespace 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文件。具体各个部分的作用直接看下面代码中的注释:

<?phpnamespace 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');

会把请求依次按照上面的顺序进行检验。这里也可以直接传入中间件组的名称,调用中间件组和单一中间件的方法是一样的。

参数设置

首先,我们使用命令行创建出来的基础中间件,默认传入的参数是两个,$requestClosure $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 验证


普通会员

2

帖子

327

回复

341

积分
沙发
发表于 2022-05-10 17:23:34

如果这就是爱,再转身的时候就该留下

普通会员

0

帖子

331

回复

336

积分
板凳
发表于 2024-04-29 01:27:46

记录一下

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017