Laravel 中间件:中间件参数 2 个改进

问题

当我分配一个中间件给路由时,能否附加额外的中间件参数?

回答

中间件可以接收附加的参数。注意:这里的参数,不是指用户输入的参数,而是在定义路由,分配中间件时通常由开发人员指定的附加参数。这样,中间件就可能通过附加参数的不同,执行不同的逻辑。比如,如果你的应用程序需要在执行给定操作之前验证用户是否为给定的「角色」 ,你可以创建一个 CheckRole 中间件,由它来接收「角色」名称作为附加参数。

下面是 CheckRole 中间件示例源码:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    /**
     * 处理传入的参数
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

可以看到,附加的中间件参数 $role 应定义在 handle 方法的 $next 参数之后。

然后,在定义路由时通过 : 来隔开中间件键名和附加的中间件参数值。如果要附加多个参数,可以用逗号分隔它们:

Route::put('post/{id}', function ($id) {
    //
})->middleware('role:editor');

Route::put('post/{id}', function ($id) {
    //
})->middleware('middleware:param1,param2');
  • 注意:
    • 如果$next后还有参数,路由中必须有对等数量的值进行传递,否则会报错缺少参数
    • 如果存在参数有时候会在路由中指定,有时候无需指定的情况,需要对$next后面的参数给定默认值。

参考

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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