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

时间:2017-08-22 04:38:45

标签: php laravel laravel-5.4

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

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

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

------------------------- update -------------

我试过这个

$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

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

8 个答案:

答案 0 :(得分:11)

我认为最好这样做:

JSON

然后只需将条件放在控制器功能上,无论是地理/数学/化学等等。

你不觉得吗?

答案 1 :(得分:11)

为什么不这样做:

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

我知道这是一个基本的方法。然而,您可以轻松地添加主题,理解它是清楚和轻松的。

答案 2 :(得分:6)

您可以尝试以下操作:

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

使用如下:

 {!!URL::to('chemistry/news')!!}
 {!!URL::to('geography/news')!!}
 {!!URL::to('math/news')!!}

答案 3 :(得分:5)

您可以尝试使用组中的as选项告诉路由器将字符串添加到该组中的每个路由名称。为此,请尝试以下方法:

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

所以你能做的就是:

<a href="{{route('chemistry.article_index')}}"> link to article </a>
<a href="{{route('math.article_index')}}"> link to article </a>
<a href="{{route('geography.article_index'}})"> link to article </a>

希望它有所帮助。

答案 4 :(得分:4)

这里有几个好的答案,可能只是个人偏好或更适合的项目细节。这是桩的另一种选择。

我不确定为什么@Shams的答案被低估了,这对我来说似乎是最干净的方法 - 但前提是限制前缀以便只接受有效的主题。类似的东西:

// Only 1 place to update if you add subjects
$subjectRegex = 'math|geography|chemistry';

// Only 1 route per 'group'
Route::get('{subject}/news', 'NewsController@index')->name('news_index')->where('subject', $subjectRegex);
Route::get('{subject}/article', 'ArticleController@index')->name('article_index')->where('subject', $subjectRegex);

作为奖励,您可以在Controller方法中使用$subject,这似乎可能有用,例如您可以使用它在当前主题中生成路线:

route('article_index', ['subject' => $subject])

答案 5 :(得分:3)

您可以对路由组进行通配符,并在RouteServiceProvider

中指定首选前缀

routes.php文件

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

RouteServiceProvider启动方法

Route::bind('slug',function ($name){
   $prefix = ["math","chemistry","geography"];
    if(!in_array($name,$prefix))
     {
        //handle wrong prefixes
        throw new \Exception("Something went wrong");
     }
 });

使用命名路线

{{route('news_index',['slug'=>'math'])}}

答案 6 :(得分:2)

仅仅为了好奇,我尝试了laravel中前缀路由分组的可选参数,并且它有效。看看:

Route::group(['prefix' => '{subject?}', 'as'=> 'subject.', where' => ['subject' => 'math|english|geo']],function (){
    Route::get('news', function (){
       return 'This is the news';
    })->name('news');
});

很确定这是你梦寐以求的解决方案。

在此之前,这将是正确的答案,可能会有一些问题。致电route('subject.news')即可获得http://example.com/news。为了让它快乐,您必须将可选参数传递给route()函数,例如route('subject.news','math');;那么你将http://example.com/math/news

  

PS:这是在Laravel 5.4.30 PHP 7.1

上完成的

答案 7 :(得分:0)

您可以使用路线参数

代替分组
Route::get('/{prefix}/news', 'NewsController@index')->name('news_index');
Route::get('/{prefix}/article', 'ArticleController@index')->name('article_index');