我想通过在访问特定的寄存器显示页面时用URL上的名称替换某个对象的ID号,从而使我的Laravel应用程序上的URL对SEO更友好。有人知道吗?
这是我到目前为止所得到的,它正常显示id作为URL的最后一个参数:
web.php
Route::get('/job/show/{id}', ['as'=>'website.job.show','uses'=>'HomeController@show']);
控制器方法
public function show($id){
$job = Job::findOrFail($id);
return view('website.job')->with(compact('job'));
}
刀片页面上有指向该页面的链接
<a href="{{route('website.job.show', $job->id)}}">{{$job->name}}</a>
答案 0 :(得分:1)
您只需将7.x.x
替换为id
:
name
在控制器操作中:
Route::get('/job/show/{name}', ['as'=>'website.job.show','uses'=>'HomeController@show']);
最后在刀片页面中:
public function show($name){
//Make sure to replace the 'name' string with the column name in your DB
$job = Job::where('name', $name)->first();
return view('website.job')->with(compact('job'));
}
答案 1 :(得分:1)
您可以覆盖Job
模型的键名:
public function getRouteKeyName()
{
return 'name';
}
然后在您的路线中只需使用{job}
:
Route::get('/job/show/{job}', ...);
并拨打您的路线:
route('website.job.show', $job);
所以您的a
标签看起来像这样:
<a href="{{ route('website.jobs.show', $job) }}">{{ $job->name }}</a>
在控制器内部,您可以更改方法的签名以自动接收作业:
public function show(Job $job)
{
return view('website.job')
->with(compact('job'));
}
有关更多信息,请参见在隐式绑定下定制键名:https://laravel.com/docs/5.8/routing#implicit-binding
答案 2 :(得分:0)
2个选项:
1)就像@ zakaria-acharki在他的评论中写的那样,按职位名称搜索并按名称获取数据
2)第二个方法是像在stackoverflow中一样
使用ID /名称构建网址
这样,您将确保通过唯一ID提取并显示相关的作业对象
路线:
Route::get('/job/show/{id}/{name}', ['as'=>'website.job.show','uses'=>'HomeController@show']);
在控制器中,更新检查名称是否等于作业名称(如果已更改的话),以防止页面URL重复
public function show($id, $name){
$job = Job::findOrFail($id);
// check here if( $job->name != $name ) {
// redirect 301 to url with the new name
// }
return view('website.job')->with(compact('job'));
}
在blade.php中:
<a href="{{route('website.job.show', $job->id, $job->name)}}">{{$job->name}}</a>