laravel 博客可以用 {post:slug} 按 slug 找到文章,再在详情控制器里检查发布状态。页面链接使用同一具名路由,已发布文章能打开,草稿和不存在的 slug 都返回 404。
用 slug 绑定 Post 模型
先确保 posts.slug 有唯一索引。下面代码放入 routes/web.php,Post 模型及控制器按项目现有结构接入。
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::get('/posts/{post:slug}', [PostController::class, 'show'])
->name('posts.show');
找不到 slug 时,Laravel 在调用控制器前就会返回 404。
公开详情页只显示已发布文章
示例假定 status 为 published 时可以公开。把方法加到 PostController。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
public function show(\App\Models\Post $post)
{
abort_unless($post->status === 'published', 404);
return view('posts.show', ['post' => $post]);
}
草稿预览如有需要,应走已有鉴权的管理入口。
用具名路由生成链接并验证状态
在文章列表里传入 slug 字符串。详情模板使用 Blade 默认转义。
{{-- 列表页 --}}
<a href="{{ route('posts.show', ['post' => $post->slug]) }}">
{{ $post->title }}
</a>
{{-- resources/views/posts/show.blade.php --}}
<h1>{{ $post->title }}</h1>
<div style="white-space: pre-wrap">{{ $post->body }}</div>用已发布、草稿和不存在的 slug 各访问一次,预期分别为 200、404、404。示例正文按纯文本展示。

















