1

我试图在我的 Laravel 应用程序上使我的 URL 对 SEO 更友好,方法是在转到该特定注册显示页面时用 URL 上的名称替换某个对象的 ID 号。有谁知道怎么做?

这是我到目前为止得到的,它像往常一样显示 id 作为 URL 的最后一个参数:

网页.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>
4

3 回答 3

2

您只需将 替换idname

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>
于 2019-04-18T14:36:27.587 回答
2

您可以覆盖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

于 2019-04-18T14:39:03.843 回答
0

2个选项:

1)一个就像@zakaria-acharki在他的评论中写的那样,按工作名称并按名称搜索以获取数据

2)第二个是在stackoverflow中这样做

使用 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'));
}

在刀片.php 中:

<a href="{{route('website.job.show', $job->id, $job->name)}}">{{$job->name}}</a>
于 2019-04-18T14:41:59.557 回答