正在 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>