Подтвердить что ты не робот

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

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

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

>math 
>geography 
>chemistry 

пользователь выбирает 1 для этих и изменений содержимого веб-сайта в зависимости от выбора пользователя

например, если пользователь выбирает математику, он увидит новости, статью, видеоролики о математике и т.д.... прямо сейчас это то, что они делают (просьбы игнорируют синтаксические ошибки)

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

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

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

в основном повторяя все ссылки для каждого префикса.... но по мере роста ссылок он станет все более неуправляемым... есть ли лучший способ сделать это? что-то вроде

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

------------------------- обновление -------------

Я пробовал это

$myroutes =  function () {
    Route::get('/news', '[email protected]')->name('news_index');
    Route::get('/article', '[email protected]')->name('article_index');
};

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

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

например, если я нажимаю на math

мои ссылки будут

site.com/math/news

но все ссылки на загруженной странице, например

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

выглядят как

site.com/geography/article

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

4b9b3361

Ответ 1

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

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

foreach ($subjects as $subject) {
    Route::prefix($subject)->group(function () {
        Route::get('news', '[email protected]')->name('news_index');
        Route::get('article', '[email protected]')->name('article_index');
    });
}

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

Ответ 2

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

Route::get('/news/{group}', '[email protected]')->name('news_index')->where('group', 'math|geography|chemistry');

А затем просто поставьте условие для функции контроллера, будь то география/математика/химия/и т.д.

Ты не думаешь?

Ответ 3

Вы можете попробовать следующее:

$myroutes =  function () {
    Route::get('/news', '[email protected]')->name('news_index');
    Route::get('/article', '[email protected]')->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')!!}

Ответ 4

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

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

Ответ 5

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

Я не уверен, почему ответ @Shams был отменен, он кажется самым чистым подходом ко мне - но только если префиксы ограничены, поэтому принимаются только действительные темы. Что-то вроде:

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

// Only 1 route per 'group'
Route::get('{subject}/news', '[email protected]')->name('news_index')->where('subject', $subjectRegex);
Route::get('{subject}/article', '[email protected]')->name('article_index')->where('subject', $subjectRegex);

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

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

Ответ 6

Вы можете настроить групповую группу и указать предпочтительные префиксы в RouteServiceProvider

routes.php

Route::group(['prefix'=>'{slug}'],function (){
 Route::get('/news', '[email protected]')->name('news_index');
 Route::get('/article', '[email protected]')->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'])}}

Ответ 7

Просто ради любопытства я попытался использовать необязательный параметр для группировки маршрутов префикса в 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() i.e. route('subject.news','math');, например; то у вас будет http://example.com/math/news.

PS: Это было сделано на Laravel 5.4.30 PHP 7.1

Ответ 8

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

Route::get('/{prefix}/news', '[email protected]')->name('news_index');
Route::get('/{prefix}/article', '[email protected]')->name('article_index');