gpt4 book ai didi

laravel - 在 Laravel 5.3 中访问中间件中的路由 URL 参数

转载 作者:行者123 更新时间:2023-12-02 12:02:01 27 4
gpt4 key购买 nike

Laravel 5.1 更新到 Laravel 5.3 后,我很难访问中间件中的路由 URL 参数。

这是我的路线文件:

Route::group(['middleware' => ['app.access']], function()
{
Route::resource('apps/{apps}/houses', 'HouseController',
['except' => ['index', 'create', 'edit']]);

Route::get('apps/{apps}/houses/colour/{colour}', 'HouseController@colourCheck');
...
}

Kernel.php 已更新 RouteMiddleware,如下所示:

protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
// Added ones....
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
// Custom Middleware
'app.access' => \App\Http\Middleware\AppAccess::class,
];

Laravel 5.1 中,我能够像这样从中间件访问路由参数,并且没有遇到任何问题:

public function handle($request, Closure $next)
{
$appId = $request->route('apps');
...
}

但是,自从升级到 Laravel 5.3 后,上面的代码开始将 $appId 返回为 null。我还尝试访问像 $appId = $request->apps 这样的路由参数,但这也不起作用。

因此,我更改了中间件以获取如下所示的 url 参数:

public function handle($request, Closure $next)
{
$appId = $request->route()->parameters('apps');
...
}

自从更改为上述内容后,中间件似乎适用于第一条路线。但是,当我转到有两个参数的第二条路线时,我遇到了问题。由于某种原因,上面的代码失败,当从中间件返回 $request->route()->parameters('apps') 时,我得到一个像这样的数组:

Array
(
[apps] => 1
[colour] => green
)

这是为什么呢?为什么它不只返回 $appId (即 1)?我错过了什么还是 Laravel 5.3 中的错误?我希望中间件仅访问 url 中的 appId 参数,而不访问路由中的其他参数。有人可以帮我吗?

更新1:

我尝试更改中间件来获取如下参数:

$parameters = $request->route()->parameters();
$appId = $parameters['apps'];

在上面,我收到错误:

Undefined index: apps

但是当我print_r($parameters);时,输出如下:

Array
(
[apps] => 1
[day] => tuesday
)
[]

解决方案:

最后,我发现这种奇怪行为的原因是由于 url 中的参数名称所致。

以下资源路由将路由 url 参数生成为 app 而不是 apps。但我不知道为什么:

Route::resource('apps/{apps}/houses', 'HouseController',
['except' => ['index', 'create', 'edit']]);

而以下路由将路由 url 参数生成为 apps:

Route::get('apps/{apps}/houses/colour/{colour}', 'HouseController@colourCheck');

由于这种奇怪的行为,一些路由返回参数名称 appsnull 以及一些显示参数的路由。当我将 routes/api.php 和中间件中的所有路由参数重命名为 {app} 后,中间件开始按其应有的方式工作。

我不知道为什么资源路由将参数创建为 app,但上面的内容为我修复了错误,至少现在是这样。

最佳答案

访问中间件中的参数有两种方法:

方法1$request->route('parameter_name');这里的parameter_name指的是我们在路由中所说的参数。

方法2$request->route()->parameters();该方法将返回所有参数的数组。

关于laravel - 在 Laravel 5.3 中访问中间件中的路由 URL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40224710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com