具有相同路由组的多个前缀

2022-08-30 17:00:43

我为一所学校写了一个相当简单的网站...这个网站有新闻,文章,视频剪辑...等

它的工作方式是在主页上,我们向访问者提供一些课程,例如

>math 
>geography 
>chemistry 

用户选择1个根据用户选择和网站内容变化

例如,如果用户选择数学,他将看到新闻,文章,关于数学的视频等等......现在这就是我正在做的事情(请求忽略语法错误)

Route::group(['prefix'=>'math'], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

Route::group(['prefix'=>'geography'], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

Route::group(['prefix'=>'chemistry'], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

基本上重复每个前缀的所有链接....但随着链接的增长,它将变得越来越难以管理...有没有更好的方法来做到这一点?类似的东西

Route::group(['prefix'=>['chemistry','math' , 'geography' ], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

-------------------------更新-------------

我试过这个

$myroutes =  function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
};

Route::group(['prefix' => 'chemistry'], $myroutes);
Route::group(['prefix' => 'math'], $myroutes);
Route::group(['prefix' => 'geography'], $myroutes);

并且它工作正常,问题是最后一个前缀附加到所有内部链接

例如,如果我点击数学

我的链接将是

site.com/math/news

但是加载页面上的所有链接都像

<a href="{{route('article_index')"> link to article </a>

site.com/geography/article

基本上链接获取最后提到的前缀,而不管当前选择的前缀


答案 1

为什么不这样做:

$subjects = [
    'chemistry', 'geography', 'math'
];

foreach ($subjects as $subject) {
    Route::prefix($subject)->group(function () {
        Route::get('news', 'NewsController@index')->name('news_index');
        Route::get('article', 'ArticleController@index')->name('article_index');
    });
}

我知道这是一种基本的方法。然而,您可以轻松添加主题,这是清晰而轻松理解的。

更新

正如评论中指出的那样,根据主题命名路线可能很方便,以下是执行此操作的方法:

$subjects = [
    'chemistry', 'geography', 'math'
];

foreach ($subjects as $subject) {
    Route::prefix($subject)->group(function () use ($subject) {
        Route::get('news', 'NewsController@index')->name("{$subject}_news_index");
        Route::get('article', 'ArticleController@index')->name("{$subject}_article_index");
    });
}

答案 2

我认为最好这样做:

Route::get('/news/{group}', 'NewsController@index')->name('news_index')->where('group', 'math|geography|chemistry');

然后只需在控制器函数上设置条件,无论是地理/数学/化学/等。

你不觉得吗?


推荐