正在 Laravel 路由 URL 上用 object 名称替换 object ID
Replacing object ID by object name on URL on Laravel route
我试图通过将某个 object 的 ID 号替换为 URL 上的名称,使我的 URL 在我的 Laravel 应用程序上更加 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'));
}
Blade 页面link 那个页面
<a href="{{route('website.job.show', $job->id)}}">{{$job->name}}</a>
您只需将 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'));
}
终于在 blade 页面:
<a href="{{route('website.job.show', $job->name)}}">{{$job->name}}</a>
您可以覆盖您的 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 个选项:
1) 就像@zakaria-acharki 在他的评论中写的那样,通过工作的名称并通过名称搜索来获取数据
2) 第二个是在 Whosebug 中像这里那样做
用 id/name
构建 url
通过这种方式,您将确保通过唯一 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>
我试图通过将某个 object 的 ID 号替换为 URL 上的名称,使我的 URL 在我的 Laravel 应用程序上更加 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'));
}
Blade 页面link 那个页面
<a href="{{route('website.job.show', $job->id)}}">{{$job->name}}</a>
您只需将 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'));
}
终于在 blade 页面:
<a href="{{route('website.job.show', $job->name)}}">{{$job->name}}</a>
您可以覆盖您的 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 个选项:
1) 就像@zakaria-acharki 在他的评论中写的那样,通过工作的名称并通过名称搜索来获取数据
2) 第二个是在 Whosebug 中像这里那样做
用 id/name
构建 url通过这种方式,您将确保通过唯一 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>