Laravel中间件如何为请求及重定向添加查询字符串?
解决方案
1. 创建中间件
先生成处理逻辑的中间件:
php artisan make:middleware AppendAuthQueryParam
2. 编写中间件核心逻辑
打开app/Http/Middleware/AppendAuthQueryParam.php,替换handle方法内容:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; class AppendAuthQueryParam { public function handle(Request $request, Closure $next) { // 检查会话标记,这里假设会话键为'needs_auth_param' if ($request->session()->has('needs_auth_param')) { // 给当前请求的查询字符串追加参数(避免重复添加) if (!$request->query->has('test')) { $request->query->add(['test' => 'test']); } $response = $next($request); // 拦截重定向响应,自动追加查询参数 if ($response instanceof RedirectResponse) { $targetUrl = $response->getTargetUrl(); $urlParts = parse_url($targetUrl); parse_str($urlParts['query'] ?? '', $queryParams); if (!isset($queryParams['test'])) { $queryParams['test'] = 'test'; $newQuery = http_build_query($queryParams); $newUrl = "{$urlParts['scheme']}://{$urlParts['host']}{$urlParts['path'] ?? ''}?{$newQuery}"; $response->setTargetUrl($newUrl); } } return $response; } return $next($request); } }
3. 注册全局中间件
打开app/Http/Kernel.php,将中间件加入web中间件组,确保所有Web请求都能触发该逻辑:
protected $middlewareGroups = [ 'web' => [ // ... 其他已存在的中间件 \App\Http\Middleware\AppendAuthQueryParam::class, ], ];
为什么之前的方法不生效?
URL::defaults(['test'=>'test']):此方法用于设置路由参数的默认值,并非查询字符串参数,不会出现在URL的?后缀中。$request->merge(['test'=>'test']):该方法仅合并POST/PUT等请求的表单请求体,不会修改GET请求的查询字符串,重定向也不会继承这些参数。$request->fullUrlWithQuery(['test' => 'test']):这只是生成带参数的URL字符串,但未将其绑定到重定向逻辑中,因此不会实际生效。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

