Laravel路由重定向带参数异常问题排查
嘿,我来帮你排查这个Laravel路由重定向的问题~
问题回顾
你尝试从 http://127.0.0.1:8000/aalc/submit_paper_step_one/9 重定向到步骤二的路由,用了Laravel的路由重定向方法,但参数却变成了Query String,导致URL不符合预期:
- 预期URL:
http://127.0.0.1:8000/aalc/submit_paper_step_two/9 - 实际得到:
http://127.0.0.1:8000/aalc/submit_paper_step_two?paper_url_id=9
你的路由代码:
Route::get('/submit_paper_step_two/{paper_url_id}','HomeController@submit_paper_step_two') ->name('submit_paper_step_two') ->middleware('guard.verified:'.$journal->journal_slug.','.$journal->journal_slug.'.verification.notice');
重定向代码:
return redirect()->route( $this->current_guard.'.submit_paper_step_two', [ 'paper_url_id' => $id ] );
核心原因
出现这个问题的关键是路由名称不匹配:
你定义的路由名称是submit_paper_step_two,但重定向时用的是$this->current_guard.'.submit_paper_step_two'(比如可能是aalc.submit_paper_step_two)。Laravel找不到这个带前缀的命名路由,就会退而求其次,把参数当成Query String拼接在URL后面,而不是填充到路由的路径占位符里。
另外还有一种可能:如果你的路由是放在带prefix或as前缀的路由组里,实际生成的路由名称会自动带上组的前缀,这时候你需要确认实际的路由名称是什么。
解决方案
1. 先确认实际的路由名称
首先用Artisan命令查看所有已注册的路由,找到目标路由的正确名称:
php artisan route:list
在输出的表格里,找到和submit_paper_step_two相关的行,查看Name列的内容,确认完整的路由名称(比如是否带有aalc.这类前缀)。
2. 修正重定向代码
根据查到的正确路由名称调整代码:
- 如果路由名称确实是
submit_paper_step_two,去掉前缀:
return redirect()->route('submit_paper_step_two', [ 'paper_url_id' => $id ] );
- 如果路由名称是带前缀的(比如
aalc.submit_paper_step_two),确保$this->current_guard的值正确,或者先写死前缀测试:
return redirect()->route('aalc.submit_paper_step_two', [ 'paper_url_id' => $id ] );
3. 检查路由组配置
如果你的路由是放在路由组里的,比如类似这样的代码:
Route::prefix('aalc')->name('aalc.')->group(function () { Route::get('/submit_paper_step_two/{paper_url_id}','HomeController@submit_paper_step_two') ->name('submit_paper_step_two') ->middleware('guard.verified:'.$journal->journal_slug.','.$journal->journal_slug.'.verification.notice'); });
那实际的路由名称就是aalc.submit_paper_step_two,这时候重定向必须使用这个完整名称,Laravel才能正确识别{paper_url_id}占位符,把参数填充到URL路径中。
内容的提问来源于stack exchange,提问作者user11162027

