Замена идентификатора объекта по имени объекта в URL на маршруте Laravel
Я пытаюсь сделать свой URL более удобным для SEO в своем приложении Laravel, заменив идентификационный номер определенного объекта на имя в URL при переходе на эту конкретную страницу регистрации. Кто-нибудь знает как?
Это то, что я получил до сих пор, и он отображает, как обычно, идентификатор в качестве последнего параметра 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>
3 ответа
Вы можете перезаписать имя ключа вашего 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
Вам нужно просто заменить 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'));
}
Наконец, на странице лезвия:
<a href="{{route('website.job.show', $job->name)}}">{{$job->name}}</a>
2 варианта:
1) один похож на @zakaria-acharki, написанный в его комментарии по названию работы и поиск по имени для извлечения данных
2) во-вторых, сделать это, как здесь, в stackru
построить URL с идентификатором / именем
таким образом вы убедитесь, что извлекаете и отображаете соответствующий объект задания по уникальному идентификатору
маршрут:
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>