Laravel - 如何通过路由组将变量传递给中间件?

Posted

技术标签:

【中文标题】Laravel - 如何通过路由组将变量传递给中间件?【英文标题】:Laravel - How to pass variables to middleware through route group? 【发布时间】:2017-08-07 06:17:06 【问题描述】:

这是我的路线组,

Route::group(['middleware' => 'checkUserLevel'], function () 
                // my routes
            );

这是我的中间件checkUserLevel

public function handle($request, Closure $next, $level)
    
        $user = Auth::user();
        if ($user->level > $level) 
            return redirect('testUrl');
        

        return $next($request);
    

我想将 $level 变量从路由组传递给中间件。 谢谢。

【问题讨论】:

How to pass arguments from router to middleware in laravel 5?的可能重复 【参考方案1】:

您可以使用冒号简单地将多个参数传递到中间件。像这样使用它:

Route::group(['middleware' => 'checkUserLevel:some_value_of_level'], function () 
            // my routes
        );

现在,您可以在 $level 变量中包含此值。

public function handle($request, Closure $next, $level)

    $user = Auth::user();
    if ($user->level > $level) 
        return redirect('testUrl');
    

    return $next($request);

这会有所帮助。


编辑:2018 年 12 月 14 日

您还可以将多个变量发送到中间件。您只需要使用逗号 (,) 分隔值。

Route::group(['middleware' => 'checkUserLevel:some_value_of_level, one_more_value_to_send'], function () 
                    // my routes
);

您将在中间件处理程序中$level 之后的变量中获得值one_more_value_to_send

public function handle($request, Closure $next, $level, $another_value)

   $user = Auth::user();
   if ($user->level > $level) 
      return redirect('testUrl');
   

   return $next($request);

更多详情可以参考:Passing parameters to Middleware in Laravel 5.1

【讨论】:

@xEterno 是的,您可以通过逗号分隔多个变量。【参考方案2】:

在 Laravel 6.x 中你必须这样做 在中间件中添加代码

 public function handle($request, Closure $next,$module=null,$right=null)
    
        dd($module,$right);
        return $next($request);
    

你的路线代码是这样的

Route::get('/department/add', 'DepartmentController@addNew')->middleware('ManualSec:abc,xyz');

在 Kernel.php 中,在 $routeMiddleware 部分中注册你的中间件

'ManualSec' => \App\Http\Middleware\ManualSec::class,

在我的例子中,通过使用 url 调用 rout

http://local.pms.com:8080/department/add

结果是这样的:

现在您可以在中间件中编码

【讨论】:

以上是关于Laravel - 如何通过路由组将变量传递给中间件?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 将变量从中间件传递到控制器/路由

如何在 laravel 5.8 中将变量传递给路由?

Laravel 路由将变量传递给控制器

将Javascript变量传递给laravel 5.3中的路由

将全局变量从当前 url 传递给 laravel 组路由

Laravel 中间件将变量返回给控制器