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

