Laravel如何从Blade表单传ID到路由,实现登录后跳转指定页面
解决方案与建议
嘿,我来帮你搞定这个Laravel评论重定向的问题~结合你的描述,咱们一步步梳理最优的解决思路:
1. 路由调整:用RESTful结构更合理
你手动给路由加上ID的思路完全正确!因为评论是属于特定opportunity的,带ID的路由结构更符合REST规范,也能直接把关联关系体现出来。修改后的路由应该是:
Route::post('/opportunities/{id}', 'OpportunitiesController@postPost')->name('posts.post');
这样在控制器方法里,你可以直接通过参数接收ID,不用额外从Request里取(当然如果需要也能取,但路由传参更直观):
public function postPost($id, Request $request) { // $id就是当前opportunity的ID,同时可通过$request获取评论表单的其他数据 // 比如 $commentContent = $request->input('comment'); }
2. 确保表单提交地址正确
要让表单正确提交到带ID的路由,记得在Blade模板里生成正确的action地址:
<form action="{{ route('posts.post', ['id' => $opportunity->id]) }}" method="POST"> @csrf <!-- 评论输入框等表单内容 --> <textarea name="comment" placeholder="写下你的评论..."></textarea> <button type="submit">提交评论</button> </form>
这样表单提交时会把ID作为路由参数传递,而不是靠POST字段,逻辑更清晰。
3. 修复登录后重定向的核心问题
这是你遇到的关键痛点:未登录用户提交评论跳去登录,登录后却回不到原opportunities/id页面。这里有两种靠谱的解决方法:
方法一:利用Laravel的intended重定向机制
在评论提交的控制器逻辑里,检测到用户未登录时,先把当前页面URL存入session的url.intended,再跳转登录:
public function postPost($id, Request $request) { if (!auth()->check()) { // 把当前页面地址存入session,供登录后跳转使用 session()->put('url.intended', url()->current()); return redirect()->route('login'); } // 后续处理评论提交逻辑 }
然后在默认的LoginController里,重写authenticated方法,用intended实现智能重定向:
protected function authenticated(Request $request, $user) { // 优先跳转到之前存储的页面, fallback到/opportunities return redirect()->intended('/opportunities'); }
方法二:跳转登录时携带redirect参数
如果觉得session存储麻烦,也可以直接在跳转登录时把当前页面URL作为参数传递:
if (!auth()->check()) { return redirect()->route('login', ['redirect' => url()->current()]); }
然后在LoginController的authenticated方法里,判断并使用这个参数:
protected function authenticated(Request $request, $user) { if ($redirectUrl = $request->get('redirect')) { return redirect($redirectUrl); } return redirect('/opportunities'); }
4. 额外的安全与验证建议
为了避免无效请求和数据错误,建议在控制器里加上两层验证:
public function postPost($id, Request $request) { // 验证对应的opportunity是否存在,不存在直接返回404 $opportunity = \App\Models\Opportunity::findOrFail($id); // 验证评论内容的合法性 $request->validate([ 'comment' => 'required|string|max:500', ]); // 创建评论并关联到当前opportunity $opportunity->comments()->create([ 'user_id' => auth()->id(), 'content' => $request->comment, ]); // 提交成功后重回原页面,带上成功提示 return redirect()->back()->with('success', '评论提交成功!'); }
这样整个流程就通顺了:未登录用户提交评论→跳转登录→登录后回到原详情页→评论提交成功后也留在原页面,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Parajuli Sunil
相关产品推荐
相关产品推荐

