You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:10:45