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
相关产品推荐
相关产品推荐

