Laravel 中间件

中间件介绍

HTTP 中间件提供了一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Auth 中间件验证用户的身份,如果未通过身份验证中间件会把用户导向登录页面,反之,会继续走下去。

  • CORS 中间件:负责替所有即将离开程序的响应加入适当的标头。
  • 日志 中间件:负责记录所有传入应用程序的请求。

Laravel 框架已经内置了一些中间件,包括维护、身份验证、CSRF 保护等等,所有的中间件都存放在 app/http/Middleware 之中。

创建中间件

$ php artisan make:middleware modemiddleware

前置中间件/后置中间件

前置中间件
  • 前置中间件 (BeforeMiddleware)

运行于请求处理之前:

 public function handle($request, Closure $next)
    {
        // 例如:只允许 email 为905530550 登录
        if ($request->input('email') == '905530550@qq.com'){

            return redirect('home');
        }
        return $next($request);
    }

译者注: 前置中间件运行的时间点是在每一个请求处理之前,可以参阅此文章加深理解:如何查看 Laravel 5 的所有数据库请求

后置中间件
  • 后置中间件 (AfterMiddleware)

这个中间件会在应用程序处理请求 后 运行它的任务:

namespace App\Http\Middleware;
use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 运行动作

        return $response;
    }
}

译者注: 后置中间件运行的时间点是在请求处理之后,可以参阅此文章加深理解:如何查看 Laravel 5 的所有数据库请求

注册中间件

全局中间件

若是希望每个 HTTP 请求都经过一个中间件,只要将中间件的类加入到 app/Http/Kernel.php$middleware 属性清单列表中。

为路由指派中间件

如果你要指派中间件给特定路由,你得先在 app/Http/Kernel.php 给中间件设置一个好记的 键,默认情况下,这个文件内的 $routeMiddleware 属性已包含了 Laravel 目前设置的中间件,你只需要在清单列表中加上一组自定义的键即可。

// 在 App\Http\Kernel 类内...

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

中间件一旦在 HTTP kernel 文件内被定义,即可在路由选项内使用 middleware 键值指定:

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

使用一组数组为路由指定多个中间件:

Route::get('/', ['middleware' => ['first', 'second'], function () {
    //
}]);

除了使用数组之外,你也可以在路由的定义之后链式调用 middleware 方法:

Route::get('/', function () {
    //
}])->middleware(['first', 'second']);

# 或者这样写
Route::post('login','SessionsController@store')->name('login')->middleware('test');

# 给IndexController 控制器里面的 index 的方法添加中间件
Route::get('/',['middleware'=>'auth','user'=>'IndexController@index'])

在分组里面使用中间件

Route::group(['namespace'=>'Admin','middleware'=>'auth','prefix'=>'admin'],function(){
    Route::get('login','SesseionsController@create')->name('login');
});
中间件参数

中间件也可以接收自定义传参,例如,要在运行特定操作前检查已验证用户是否具备该操作的「角色」,可以创建 RoleMiddleware 来接收角色名称作为额外的传参。

附加的中间件参数将会在 $next 参数之后被传入中间件:

namespace App\Http\Middleware;

use Closure;

class RoleMiddleware
{
    // 运行请求过滤
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // 如果用户没有特定「角色」的话
        }
        return $next($request);
    }
}

在路由中可使用冒号 : 来区隔中间件名称与指派参数,多个参数可使用逗号作为分隔:

Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);
本作品采用《CC 协议》,转载必须注明作者和本文链接
麦迪文
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!