Laravel 中间件:中间件参数
问题
当我分配一个中间件给路由时,能否附加额外的中间件参数?
回答
中间件可以接收附加的参数。注意:这里的参数,不是指用户输入的参数,而是在定义路由,分配中间件时通常由开发人员指定的附加参数。这样,中间件就可能通过附加参数的不同,执行不同的逻辑。比如,如果你的应用程序需要在执行给定操作之前验证用户是否为给定的「角色」 ,你可以创建一个 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
后面的参数给定默认值。
- 如果