用 Laravel 路由上的 URL 上的对象名称替换对象 ID

Posted

技术标签:

【中文标题】用 Laravel 路由上的 URL 上的对象名称替换对象 ID【英文标题】:Replacing object ID by object name on URL on Laravel route 【发布时间】:2019-09-08 22:06:57 【问题描述】:

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

这是我目前得到的,它像往常一样显示 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'));
    

有指向该页面的链接的刀片页面

<a href="route('website.job.show', $job->id)">$job->name</a>

【问题讨论】:

【参考方案1】:

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

【讨论】:

那将如何与 a 标签一起使用?我通过了工作->Id? 不,您只需像在路线中一样传递作业实例。 @LuizWynne 看看我更新的答案。我正在展示一个带有 a 标签的示例。 我会试试的。非常感谢!!【参考方案2】:

您只需将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>

【讨论】:

谢谢扎卡里亚。该解决方案的问题是 Db 中有 2 个职位名称相同,不是吗? 是的,这可能会发生,如果您需要一个唯一值,您必须使用 id 或者您可以将两者作为组合使用 id-name 您是否需要使用/job/show/1-name_here等两个值的组合的样本【参考方案3】:

2 个选项:

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

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

使用 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>

【讨论】:

第一个选项会在数据库中检索多个同名作业,第二个在我尝试时实际上并没有工作 太好了,这也是我的首选,我已经使用了很长时间。欢迎您投票:)

以上是关于用 Laravel 路由上的 URL 上的对象名称替换对象 ID的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 所有路由上的 NGINX + Apache 反向代理 404

Laravel 4:获取 URL::route 以返回 HTTPS URL,而不在路由中强制执行 HTTPS

Vue路由器上的可选参数

任何域上的 Laravel 5 子域路由

Laravel 路由上的 PHPunit 测试总是返回 404

Laravel 上的 Mailchimp API,如何在路由中使用它?