【问题标题】:Replacing object ID by object name on URL on Laravel route用 Laravel 路由上的 URL 上的对象名称替换对象 ID
【发布时间】: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>

【问题讨论】:

    标签: php laravel url laravel-blade laravel-route


    【解决方案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)第二个是在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'));
    }
    

    在blade.php 中:

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

    【讨论】:

    • 第一个选项会在数据库中检索多个同名作业,第二个在我尝试时实际上并没有工作
    • 太好了,这也是我的首选,我已经使用了很长时间。欢迎您投票:)
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2020-04-19
    • 2016-01-21
    相关资源
    最近更新 更多