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

Laravel中通过Slug展示文章时出现404 Not Found问题求助

解决Laravel中Slug访问文章出现404的问题

我来帮你排查这个404错误的根源,核心问题出在控制器的查询逻辑上,咱们一步步来修正:

1. 修正控制器的查询代码

你现在用的Post::findorFail($slug)有个关键问题:findOrFail()方法默认是根据模型的**主键字段(通常是id)**来查询数据的,而你传入的是slug字符串,数据库里显然没有id等于这个slug的记录,所以直接返回404。

把查询代码改成按slug字段查找:

public function show($slug) {
    // 明确指定按slug字段查询,找不到则返回404
    $post = Post::where('slug', $slug)->firstOrFail();
    $tags = Tag::all();
    return view('page.detail', compact('post', 'tags'));
}

2. 检查视图循环的变量(额外小问题)

你的视图代码里写了@foreach($post as $item),这里的$post如果是单个文章模型的话会触发循环报错,应该是在列表页循环文章集合(比如$posts复数),同时注意标签闭合:

{{-- 假设列表页传递的变量是$posts,是文章集合 --}}
@foreach($posts as $item)
    <a href="/post/{{$item->slug}}" class="btn-custom">Read More <span class="ion-ios-arrow-forward"></span></a>
@endforeach

3. 更优雅的方案:路由模型绑定(可选)

如果想让代码更简洁,可以给Post模型设置路由键,让Laravel自动用slug来匹配查询:
在app/Post.php模型中添加:

public function getRouteKeyName()
{
    return 'slug';
}

这样控制器里就可以回到你原来的写法Post::findorFail($slug),Laravel会自动用slug字段去查询,不用再写where条件了。

做完这些修改后,清除路由缓存(如果开启了缓存):

php artisan route:clear

然后重新访问文章链接,应该就能正常显示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:47:43