【问题标题】:Construct routes(urls) with slugs separated by dash in laravel在 laravel 中用破折号分隔的 slug 构建路由(url)
【发布时间】:2021-01-22 20:10:58
【问题描述】:

我将在我的页面上制作更多对 SEO 友好的 URL,并希望我的产品具有这样的模式:

www.example.com/product-category/a-pretty-long-seo-friendly-product-name-12

那么我们在看什么?

www.example.com/{slug1}/{slug2}-{id}

我会在控制器中的 URL 中唯一关心的是 {id}。其余两个蛞蝓只是 SEO 目的。所以我的问题。如何从 a-pretty-long-seo-friendly-product-name-12 获得 12?

我已经尝试www.mydomain.com/{slug}/{slug}-{id} 并在我的控制器中尝试获取 $id。身份证不起作用。我无法将它与一个相当长的 seo-friendly-product-name 分开。所以在我的控制器中,无论我如何将 {slug2} 和 {id} 连接起来。

从 Rails 那里来是小菜一碟,但似乎无法弄清楚如何在 laravel 中做到这一点。

编辑: 很抱歉,我提出的问题很不清楚。我正在寻找一种在路由文件中执行此操作的方法。就像在 Rails 中一样。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    您在正确的轨道上,但如果您使用的是破折号分隔的字符串,则无法真正在逻辑上分隔 /{slug}-{id}。要解决这个问题,您可以简单地分解块并选择最后一个:

    // routes/web.php
    Route::get('/{primarySlug}/{secondarySlugAndId}', [ExampleController::class, 'example']);
    
    // ExampleController.php
    public function example($primarySlug, $secondarySlugAndId){
      $parts = collect(explode('-', $secondarySlugAndId));
      $id = $parts->last();
      $secondarySlug = $parts->slice(0, -1)->implode('-');
    
      ... // Do anything else you need to do
    }
    

    给定 URL example.com/primary-slug/secondary-slug-99,您将拥有以下变量:

    dd($primarySlug, $secondarySlug, $id);
    // "primary-slug"
    // "secondary-slug"
    // "99"
    

    唯一不适用的情况是,如果您的 id 中有破折号,但这是另一层复杂性,我希望您不必处理。

    【讨论】:

    • 感谢@Tim Lewis!我可能不得不这样做。我更想在路线文件中寻找一种方法来做到这一点,就像在 Rails 中一样。
    【解决方案2】:

    Route::get('/test/{slug1}/{slug2}','IndexController@index');
    
    public function index($slug1, $slug2)
    {
       $id_slug =  last(explode('-',$slug2));
    
       $second_slug = str_replace('-'.$id_slug,'',$slug2);
    
       dd($slug1, $second_slug,$id_slug);
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2014-06-26
      • 2018-12-21
      • 2017-12-10
      • 2012-12-14
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多