Замена идентификатора объекта по имени объекта в URL на маршруте Laravel - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь сделать свой 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 ]

1 голос
/ 18 апреля 2019

Вы можете перезаписать имя ключа вашей 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

1 голос
/ 18 апреля 2019

Вам нужно просто заменить 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>
0 голосов
/ 18 апреля 2019

2 варианта:

1) один похож на @ zakaria-acharki, который написал в своем комментарии имя работы и поиск по имени для извлечения данных

2) второй - сделать это, как здесь, в stackoverflow

для создания 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...