代码之家  ›  专栏  ›  技术社区  ›  Brainmaniac

在laravel中用破折号分隔段塞构建路由(url)

  •  0
  • Brainmaniac  · 技术社区  · 4 年前

    我将在我的页面上创建更为SEO友好的URL,并希望我的产品有这样的模式:

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

    我们在看什么?

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

    我唯一关心的是控制器中URL的{id}。剩下的两个鼻涕虫只是搜索引擎优化的目的。我的问题是。如何从一个非常长的seo友好的产品名12中得到12?

    我试过了 www.mydomain.com/{slug}/{slug}-{id} 在我的控制器中尝试获取$id.id无效。我无法将它从一个相当长的seo友好的产品名中分离出来。所以在我的控制器中,不管我怎么做,我都会将{slug2}和{id}连接起来。

    编辑:

    2 回复  |  直到 4 年前
        1
  •  1
  •   Tim Lewis    4 年前

    你说得对,但你不能从逻辑上分开 /{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
    }
    

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

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

    唯一的情况是如果你的 id

        2
  •  0
  •   Dorin Puscasu    4 年前

    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);
    }