множественный префикс с той же группой маршрутов

я пишу довольно простой сайт для школы … на этом сайте есть новости, статьи, видеоклипы … и т. д.

как это работает, на домашней странице мы представляем посетителю некоторые уроки, например

>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

в основном ссылку получить последний упомянутый префикс, независимо от выбранного в данный момент

Почему бы не сделать так:

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

Я знаю, что это элементарный способ сделать это. Но вы можете легко добавлять предметы, это понятно и легко понять.

Я думаю, что лучше делать:

 Route::get('/news/{group}', 'NewsController@index')->name('news_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); 

Используйте следующее:

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

Вы можете попытаться использовать параметр 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> 

Надеюсь, поможет.

Здесь уже есть несколько хороших ответов, это, вероятно, только вопрос личных предпочтений или более глубоких особенностей проекта, который подходит. Вот еще один вариант для кучи.

Я не уверен, почему ответ @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); 

В качестве бонуса у вас есть $subject доступный в ваших методах контроллера, который, похоже, может быть полезен, например, вы можете использовать его для создания маршрутов в текущем предмете:

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

Вы можете RouteServiceProvider группу маршрутов и указать предпочтительные префиксы в вашем 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'])}}

Просто ради любопытства я попытался использовать дополнительный параметр для группировки маршрутов префикса в 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

Вместо группировки вы можете использовать параметры маршрута

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