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

Laravel中destroy()方法如何根据删除来源条件跳转路由?

问题分析与修复方案

你当前代码的核心问题是判断逻辑完全错误:route('post.show', $post->slug)是用来生成文章详情页的URL字符串,它永远会返回非空值,所以if条件永远为真,导致不管从哪个页面删除,都会执行跳首页的逻辑。

要实现「从详情页删除跳首页,其他页面(列表页)删除返回上一页」的需求,有两种可靠的实现方式:

方案一:通过请求来源URL判断

利用HTTP请求头里的referer字段获取上一页的URL,和文章详情页的URL对比:

public function destroy($id)
{
    $post = Post::findOrFail($id);
    $post->delete();

    // 获取用户跳转过来的页面URL
    $referrer = request()->headers->get('referer');
    // 生成当前文章的详情页URL
    $postShowUrl = route('post.show', $post->slug);

    // 对比来源页是否为详情页
    if ($referrer === $postShowUrl) {
        return redirect()->route('home')->with('success', '文章删除成功');
    } else {
        return back()->with('success', '文章删除成功');
    }
}

方案二:通过表单携带标识参数(更推荐)

部分浏览器的隐私设置会屏蔽referer头,导致方案一失效,所以更稳妥的方式是在删除按钮的表单里加隐藏字段,标记来源页面:

详情页的删除表单:

<form action="{{ route('post.destroy', $post->id) }}" method="POST">
    @csrf
    @method('DELETE')
    <!-- 标记来源为详情页 -->
    <input type="hidden" name="from_page" value="post_show">
    <button type="submit">删除文章</button>
</form>

列表页的删除表单:

<form action="{{ route('post.destroy', $post->id) }}" method="POST">
    @csrf
    @method('DELETE')
    <!-- 标记来源为列表页 -->
    <input type="hidden" name="from_page" value="post_list">
    <button type="submit">删除文章</button>
</form>

后端处理代码:

public function destroy($id)
{
    $post = Post::findOrFail($id);
    $post->delete();

    // 获取表单提交的来源标识
    $fromPage = request()->input('from_page');

    if ($fromPage === 'post_show') {
        return redirect()->route('home')->with('success', '文章删除成功');
    } else {
        return back()->with('success', '文章删除成功');
    }
}

内容的提问来源于stack exchange,提问作者YanikKumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:57:50