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

