Laravel 10如何将搜索结果URL改为SEO友好的Slug格式?
解决Laravel搜索URL转SEO友好Slug格式的方案
一、新增SEO友好的Slug路由
首先添加带词汇slug的GET路由,用来展示选中词汇的详情页:
// 新增:通过slug展示词汇详情的路由(路由模型绑定自动获取实例) Route::get('/admin/word-to-review/{word:slug}', 'ReviewWordController@show')->name('admin.words.review'); // 保留原有路由,用于接收搜索参数并重定向 Route::get('/modification/un-terme/choisir','choose_one')->name('choose_one'); Route::get('/modification/un-terme/autocomplete','autocomplete')->name('autocomplete'); Route::get('/modification/un-terme/revoir','review_one')->name('review_one'); // 调整POST更新路由为Slug格式(可选,更规范) Route::post('/admin/word-to-review/{word:slug}', 'ReviewWordController@update')->name('admin.words.update');
注:
{word:slug}是路由模型绑定,要求你的词汇模型(比如Word)有slug字段,Laravel会自动根据slug查询对应模型实例。
二、修改review_one方法实现重定向
原来的review_one是接收GET搜索参数的方法,现在改为找到对应词汇后重定向到Slug路由:
public function review_one(Request $request) { // 验证搜索参数(根据你的实际搜索字段调整,比如是关键词还是ID) $request->validate([ 'search' => 'required|string', // 假设搜索框name是search ]); // 根据搜索参数查询对应的词汇记录 $word = Word::where('name', $request->input('search'))->firstOrFail(); // 如果是通过ID传递,改为:Word::findOrFail($request->input('word_id')); // 重定向到Slug路由,传递slug作为参数 return redirect()->route('admin.words.review', ['word' => $word->slug]); }
三、实现Slug路由的详情展示方法
在ReviewWordController中添加show方法,通过路由模型绑定直接获取词汇实例并传递到视图:
public function show(Word $word) { // 直接将词汇数据传递到show视图 return view('admin.words.review', compact('word')); }
此时视图中可以直接使用$word变量调用词汇的所有字段(比如$word->name、$word->content等)。
四、关于重定向语法的说明
你提到的类似redirect('admin.words.review')->with($searched_word_data)的写法,正确的语法是:
- 用
route()方法指定路由名称,并传递路由参数 - 如果需要携带临时会话数据(比如提示信息),再用
with()方法
示例:
// 仅重定向到Slug路由 return redirect()->route('admin.words.review', ['word' => $word->slug]); // 重定向并携带提示信息 return redirect()->route('admin.words.review', ['word' => $word->slug]) ->with('success', '已成功加载词汇详情');
临时数据可以在视图中通过session('success')获取。
五、调整表单提交路由(可选)
如果后续要实现更新功能,表单的action要指向新的POST路由:
<form action="{{ route('admin.words.update', ['word' => $word->slug]) }}" method="POST"> @csrf <!-- 你的表单输入字段 --> <button type="submit">更新词汇</button> </form>
内容的提问来源于stack exchange,提问作者user2955335
相关产品推荐
相关产品推荐

