Laravel - 中间件


Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。

就是 用户请求 -> 中间件 -> 请求 or 控制器

比如 :

A. 有一个后台,你要是后台用户才可以访问, 那就要验证身份,后台所有功能都要检测这一步,那这个时候

就可以有一个全局中间件 , ‘Auth’;

B. 比如 API LOG 记录,每次请求了什么API, 提交的数据是什么,都可以在中间件中完成。

也可以防止出现双入口之类的API功能限制。

C. 有一个模块,只有某个特定的用户才可以操作方法, 也可以写一个专门的中间件给这个模块,局部的中间件

个人理解上来说,中间件就类似于YII 中的 beforeAction()

在做某逻辑工作前的预先判断。

[ 创建中间件 ]

我们可以使用 php artisan make:middleware middleward-name指令来创建中间件

使用完这条指令之后,就可以在 app/Http/Middleware中看到新建立的中间件了。

假如我们创建了一个 checkBelt 中间件

<?php

namespace App\Http\Middleware;

use Closure;

class CheckBelt
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if( $request->is('example6') ) {
            return redirect('example1');
        }
        return $next($request);
    }
}

如果访问的网址是 /example6, 那就重新定位到 /example1 中去。

[ 注册中间件 ]

想要使用上 checkBelt 这个中间件,那我们就需要在 kernel.php 中进行注册

<?php 
...

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,
        //新注册 checkBelt 中间件!
        'belt' => \App\Http\Middleware\CheckBelt::class,
];

...
?>

当我们在 kernel.php 中完成注册时候,我们就可以在Route 中调用了,

//修改一下路由,添加个调用中间件的连接方法。
Route::get('/example6',function(){
    $str = 'Hensin';
    return $str;
})->name('Hensin')->middleware('belt');

这个时候再去访问 example6, 就会被重定向去example1了。

[ 注册全局中间件 ]

<?php
...

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,
        //填写到这里

];

...
?>

假如我们把自己写的中间件填写到, $middleware的数组中,就会变成全局中间件,中间件会依次按顺序检测到最后一个,全部完成才会通过。这个全局中间件是不需要声明在路由中的,一定会执行的。

[ 中间件组 ]

<?php
...

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',
        ],
];

...
?>

我们可以看到其中有一个数组是$middlewareGroups,而 web 路由组会自动加载给 routes/web.php。

当我们需要使用的时候,和正常调用中间件没有区别,简化了代码而已。

[ 中间件原理探讨 ]

前往以下网址查看就可以了,写的很通俗

http://www.jianshu.com/p/f70612661422

results matching ""

    No results matching ""