Laravel5.1 中间件-middleware

中间件的主要功能是在达到最终请求动作前对请求进行过滤和处理。

中间件在Laravel中有着广泛的应用,比如用户认证、日志、维护模式、开启Session、从Session中获取错误信息,以及CSRF验证,等等。

中间件的所在目录:appHttpMiddleware。里面有一些默认的middleware

创建自己的middleware

创建middleware非常简单,我们打开终端,cd到项目目录下执行以下命令即可:

php artisan make:middleware TestMiddleware 

这样 我们就可以在appHttpMiddleware下看见我们刚刚创建的middleware了。

<?php

namespace AppHttpMiddleware;

use Closure;

class TestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // 在这里执行我们的逻辑
        return $next($request);
    }
}

实现一个简单的逻辑

我们写一个小例子来瞧瞧,在TestMiddleware的handle方法中编辑:

    public function handle($request, Closure $next)
    {
        if ($request->input('age')<18){
            return redirect()->route('refuse');
        }
        return $next($request);
    }

在路由中使用中间件,需要在appHttpKernel.php 文件中进行注册:

<?php

namespace AppHttp;

use IlluminateFoundationHttpKernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
        AppHttpMiddlewareEncryptCookies::class,
        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
        IlluminateSessionMiddlewareStartSession::class,
        IlluminateViewMiddlewareShareErrorsFromSession::class,
        AppHttpMiddlewareVerifyCsrfToken::class,
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => AppHttpMiddlewareAuthenticate::class,
        'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
        // 这是我们注册的middleware:
        'test' => AppHttpMiddlewareTestMiddleware::class,
    ];
}

注意:我们将testmiddleware注册到了 $routeMiddleware变量中,laravel的注释写的很清楚 如果我们要在全局都使用到这个middleware 就把他注册到$middleware变量中

接下来我们就可以在路由中使用middleware了:

Route::group(['prefix'=>'laravel', 'middleware'=>'test'], function (){
    Route::get('/write', function (){
        return 'Write laravel';
    });
    Route::get('/update', function (){
        return 'Update laravel';
    });
});

Route::get('/age/refuse',['as'=>'refuse', function(){
    return '您的年龄未满18岁';
}]);

我们在浏览器这样访问来测试:localhost:8000/laravel/write?age=15 或 localhost:8000/laravel/update?age=20

在请求后执行动作

有些时候,我们需要在请求后执行一些动作,可以这样写:

    public function handle($request, Closure $next)
    {
        $response = $next($request);
        // 执行一些动作

        return $response;
    }

当然,必要的业务逻辑也有在请求前做认证,在请求后做一些动作的情况。

带参数的Middleware

除了请求实例$request和闭包$next之外,中间件还可以接收额外参数,我们还是以TestMiddleware为例,现在要求年龄在18岁以上的男性才能访问指定页面,handle方法定义如下:

    public function handle($request, Closure $next, $gender)
    {
        if ($request->input('age')>=18 && $gender==$request->input('gender')){
            return $next($request);
        }
        return redirect()->route('refuse');
    }

对应的修改路由:

// 使用:语法为middleware传入参数
Route::group(['prefix'=>'laravel', 'middleware'=>'test:male'], function (){
    Route::get('/write', function (){
        return 'Write laravel';
    });
    Route::get('/update', function (){
        return 'Update laravel';
    });
});

Route::get('/age/refuse',['as'=>'refuse', function(){
    return '本站只允许满18岁的男士访问';
}]);
原文地址:https://www.cnblogs.com/Alex-sk/p/6432940.html