Laravel博客URL修改方案:将详情页ID替换为文章标题
实现Laravel博客URL用文章标题替代数字ID的方案
1. 调整路由配置
把你现有的博客详情路由修改为接受文章slug(格式化后的友好标题),同时开启Laravel模型绑定简化查询逻辑:
// 替换原有/blog-details路由 Route::get('/blog-details/{post:slug}', [HomeController::class, 'blogDetails'])->name('blogDetails');
{post:slug}表示通过Post模型的slug字段匹配路由参数,框架会自动查询对应文章实例。
2. 为文章模型添加Slug字段
首先在博客文章数据表中新增slug字段(字符串类型,设置唯一索引),然后在对应模型(如Post.php)中添加自动生成slug的逻辑:
use Illuminate\Support\Str; class Post extends Model { protected static function booted() { static::creating(function ($post) { // 基于标题生成基础slug $post->slug = Str::slug($post->title); // 处理slug重复情况,追加随机字符串保证唯一性 while (static::whereSlug($post->slug)->exists()) { $post->slug = Str::slug($post->title) . '-' . Str::random(5); } }); } }
若已有存量文章,可编写一次性Artisan命令批量生成slug。
3. 修改控制器方法
借助模型绑定,控制器方法可直接接收Post实例,无需手动查询:
public function blogDetails(Post $post) { return view('blog.details', compact('post')); }
若暂时不想用模型绑定,也可手动通过slug查询:
public function blogDetails($slug) { $post = Post::where('slug', $slug)->firstOrFail(); return view('blog.details', compact('post')); }
4. 更新前端链接生成
将原来用文章ID生成链接的逻辑,替换为使用slug:
<!-- 替换旧的ID传参方式 --> <a href="{{ route('blogDetails', ['slug' => $post->slug]) }}">{{ $post->title }}</a>
5. 旧URL兼容处理(可选)
若要保证/blog-details/125这类旧URL仍可访问,可添加重定向路由:
// 旧ID格式URL永久重定向到新slug URL Route::get('/blog-details/{id}', function ($id) { $post = Post::findOrFail($id); return redirect()->route('blogDetails', ['slug' => $post->slug], 301); });
301永久重定向有助于SEO,告知搜索引擎旧地址已永久迁移。
内容的提问来源于stack exchange,提问作者ashik arman
相关产品推荐
相关产品推荐

