如何使用可选参数将网址扩展名添加到laravel路由?

时间:2019-04-03 13:47:07

标签: php laravel url-routing

对于具有类别和产品的网上商店,我有以下路线:

Route::name('shop.products.view')->get('/p/{productUrl}', 'Shop\ProductsController@view');
Route::name('shop.categories.view')->get('/c/{categoryOne}/{categoryTwo?}/{categoryThree?}', 'Shop\CategoriesController@view')

categoryTwo是categoryOne的子类别

categoryThree是类别Two的子类别

这很完美,但是我需要在.html末尾加上网址,以便该网址与旧网上商店的网址完全相同。

对于产品页面,这没问题:

Route::name('shop.products.view')->get('/p/{productUrl}.html', 'Shop\ProductsController@view');

如果我对类别页面执行此操作,则在未填写可选参数时不起作用。

Route::name('shop.categories.view')->get('/c/{categoryOne}/{categoryTwo?}/{categoryThree?}.html', 'Shop\CategoriesController@view')

结果为: domain.com/c/category1 //。html

关于如何解决这个问题的任何想法,我都会得到:

domain.com/c/category1.html

domain.com/c/category1/category2.html

domain.com/c/category1/category2/category3.html

1 个答案:

答案 0 :(得分:0)

您有两个选择:

  1. .html之后使用category2和category3作为查询参数,并将其作为?category2=aaa&category3=bbb传递;
  2. 如下定义同一组下的多个路由(请参见下一个代码示例)。我不喜欢这种解决方案,但如果您正确调用路由而不是从URL构建器URL::action('Shop\CategoriesController@view')中调用路由,它将可以正常工作。
    Route::name('shop.products.view.')->group(function () {
        Route::get('/c/{categoryOne}/{categoryTwo}/{categoryThree}.html', 'Shop\CategoriesController@view');
        Route::get('/c/{categoryOne}/{categoryTwo}.html', 'Shop\CategoriesController@view');
        Route::get('/c/{categoryOne}.html', 'Shop\CategoriesController@view')
    });