Laravel学习记录(四):中间件

说实话自己在做项目的时候对中间件的印象不是很深,我对中间件这个词也不太理解。

文档记载,中间件是用来提供一种机制来对HTTP请求进行过滤的,参考上周使用throttle中间件来对网页进行访问流量控制的相关例子,大概对这个东西有了一点理解。但是还是边做边看吧。

中间件提供了一种方便的机制来检查和过滤进入应用程序的HTTP请求。例如判断用户是否经过身份验证,如果没有通过身份验证,那就重定义到之前的登录页面,不然就顺利登入程序。

定义中间件

使用php artisan make:middleware Xxx类似的语句在项目中添加一个中间件。

基本上类中定义的方法是用来处理请求的,像是请求中的参数满足条件可以正常访问,不满足重新定义到首页等。

还有前置和后置中间件之分。

包含和使用中间件

全局中间件需要在app\Http\Kernel.php中的$middleware属性下包含该中间件。

差不多是这个样子。

而给路由分配中间件,是在$routeMiddleware中添加,需要构建类似功能=>middleware的键值对。

然后用middleware()方法分配。

Route::get('admin/profile', function () {
    //
})->middleware('auth');

还可以给路由分配多个中间件。

给一组中间件绑定一个键值,就是一个中间件组,可以按照上面讲的方法给路由分配中间件。

中间件执行任务可以在实际执行完之前,也可以在之后。

排除中间件,用withoutMiddleware,用的场景主要是,一组路由赋予了一个中间件,有一个路由用不到的情况。

可以在整个组路由中定义排除一组给定的中间件:

use App\Http\Middleware\EnsureTokenIsValid;

Route::withoutMiddleware([EnsureTokenIsValid::class])->group(function () {
    Route::get('/profile', function () {
        //
    });
});

中间件组,有时候希望可以将多个中间件组合在一个键下,使得更容易分配给路由,可以使用middlewareGroup属性来完成操作。大概就是用建立数组的方法。

/**
 * 应用程序的路由中间件组。
 *
 * @var array
 */
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:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

如何确定中间件的优先级,可以使用middlewarePriority属性来控制优先级。

总结

东西不多,主要是做一个请求处理的中间层。有些东西暂时用不上。