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

Laravel中如何用cviebrock/eloquent-sluggable在视图显示slug并生成链接

问题解决步骤

首先先梳理你现有代码里的几个问题,再一步步修正实现需求:

1. 修正Model代码(移除冗余逻辑)

你手动在boot方法里生成slug是多余的,cviebrock/eloquent-sluggable包会自动处理创建、更新时的slug生成,包括重复slug的自动后缀处理,删掉手动逻辑即可:

use Cviebrock\EloquentSluggable\Sluggable;

class Kind extends Model
{
    use Sluggable;

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title',
                'onUpdate' => true
            ]
        ];
    }
}

2. 修正路由(解决冲突+添加详情路由)

你现有两个重复的/tenderview GET路由,会导致只有最后一个生效。需要区分列表页和详情页路由,详情页要接收slug参数:

// 列表页路由:展示所有数据
Route::get('/tenderview', 'TenderViewController@index')->name('tenderview.index');

// 详情页路由:通过slug定位单个数据(用路由模型绑定自动查询)
Route::get('/tenderview/{kind:slug}', 'TenderViewController@show')->name('tenderview.show');

3. 修正Controller逻辑

调整列表和详情方法的职责,列表页负责传数据集合,详情页通过路由模型绑定获取单个数据:

public function index()
{
    // 列表页获取分页数据
    $dataa = Kind::orderBy('created_at', 'DESC')->paginate(8);
    return view('tenderview.index', compact('dataa'));
}

public function show(Kind $kind)
{
    // 路由模型绑定已自动根据slug查询到对应实例,直接传给详情视图
    return view('tenderview.show', compact('kind'));
}

注:建议把列表和详情视图分开(比如tenderview/index.blade.php和tenderview/show.blade.php),避免逻辑混淆。

4. 在列表视图生成带slug的链接

在列表视图(tenderview/index.blade.php)里,用route助手函数生成指向详情页的链接,直接传入模型实例或slug参数即可:

@foreach($dataa as $dater)
    <a href="{{ route('tenderview.show', $dater) }}">{{ $dater->name }}</a>
@endforeach

这里直接传$dater实例,Laravel会自动提取模型的slug字段作为路由参数,也可以手动传$dater->slug效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:15:10