用 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