将参数传递给 Laravel 中的中间件

Posted

技术标签:

【中文标题】将参数传递给 Laravel 中的中间件【英文标题】:Passing parameters to middleware in Laravel 【发布时间】:2017-04-19 22:01:30 【问题描述】:

假设我有一个指向中间件的路由;

Route::get("/user/id", ['middleware' => 'auth', function ($id) 

]);

而我的中间件代码如下:

public function handle($request, Closure $next)

    return $next($request);

如果我想在中间件中使用$id,我该怎么做?

【问题讨论】:

你有 $request 变量使用它:) ($request->id) 一个很有误导性的标题,应该是:“Passing route parameters to middleware in Laravel”。也许有人想传递一个不是路由参数的参数。接受的答案与标题不符。 【参考方案1】:

在您的情况下,您不能将$id 传递给中间件。

一般你可以像这样使用:符号将参数传递给中间件:

Route::get('user/id', ['middleware' => 'auth:owner', function ($id) 
    // Your logic here...
]);

并将传递的参数获取到中间件方法中,如下所示:

<?php

namespace App\Http\Middleware;

use Closure;

class Authentication

    public function handle($request, Closure $next, $role)
    
        if (auth()->check() && auth()->user()->hasRole($role)) 
            return $next($request);
        

        return redirect('login');
    

注意handle() 方法,它通常只需要一个$request 和 一个$next closure,有一个third parameter,这是我们的中间件 参数。

如果您将多个参数(例如 auth:owner,subscription)传递给中间件 在路由定义中调用,只需添加更多参数到您的 处理方法看起来像这样 - handle($request, Closure $next, $role,$subscription)

【讨论】:

至少加上来源:mattstauffer.com/blog/… 好的,但是从哪里获取参数值呢?是否必须通过控制器将它们添加到请求中,是否必须将它们添加到 URL 中,例如“some/parameter/store”或如何填充? 也可能对某人有用,您可以使用逗号分隔符将多个参数传递给中间件。像这样:Route::middleware(['auth.basic:driverName,fieldName'])【参考方案2】:

您可以使用以下方法之一来访问中间件中的路由参数:

第一种方法

$request-&gt;route()-&gt;parameters();

此方法将返回一个包含所有参数的数组。

第二种方法

$request-&gt;route('parameter_name');

这里parameter_name指的是你在路由中调用的参数。

【讨论】:

以上是关于将参数传递给 Laravel 中的中间件的主要内容,如果未能解决你的问题,请参考以下文章

axios将参数传递给laravel路径

如何将 vue.js 值作为参数传递给刀片中的路由

Laravel 6 如何将参数传递给 Vue Js @click 方法

将命令行参数传递给调用带有装饰器参数的装饰函数的函数

如何将参数传递给 Laravel 包中的控制器操作?

如何将 url 中的参数传递给背包创建表单