Laravel:可选路由前缀参数

4
我目前正在开发一个多站点应用程序(一个代码库为多个(子)站点提供支持),我希望利用路由缓存,但是目前我正在硬编码一个前缀而不是动态确定它。
当我尝试这样做时,遇到了下面所示的问题:
Route::group(['prefix' => '{subsite}', 'subdomain' => '{site}.domain.tld'], function () {
    Route::get('blog', 'BlogController@index')->name('blog.index');
});

当访问像http://sitename.domain.tld/subsitename/blog这样的子站点时,一切都很正常,但是当不访问子站点时,如http://sitename.domain.tld/blog,它将认为前缀是“blog”而失效了。

有没有办法允许“subsite”参数为空或跳过?

谢谢!


Laravel确实具有可选参数,但这些参数只能作为列表中的最后一个参数使用。我认为你最好的选择是将所有需要可选子站点的路由封装在一个函数中,并创建两个路由组,一个带子站点,一个不带。 - milo526
1个回答

3
据我所知,当前的路由系统中没有任何东西可以让你通过单个路由组来解决你的问题。
虽然这并没有回答你具体的问题,但我可以想到两种实现你期望行为的方法。

1. 复制路由组

Route::group(['subdomain' => '{site}.domain.tld'], function () {
    Route::get('blog', 'BlogController@index')->name('blog.index');
});

Route::group(['prefix' => '{subsite}', 'subdomain' => '{site}.domain.tld'], function () {
    Route::get('blog', 'BlogController@index')->name('blog.index');
});

2. 遍历预期前缀的数组。

$prefixes = ['', 'subsiteone', 'subsitetwo'];

foreach($prefixes as $prefix) {
    Route::group(['prefix' => $prefix, 'subdomain' => '{site}.domain.tld'], function () {
        Route::get('blog', 'BlogController@index')->name('blog.index');
    });
}

1
感谢您的回复,Jeemusu!这些方法的问题在于命名路由会相互覆盖,因此前往 route('blog.index') 将始终链接到最后定义的路由。不幸的是,第二种方法无法与路由缓存一起使用 :( - Stidges
啊,我的错误!名称需要更改为每个前缀都是唯一的。 - Jeemusu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接