Множественный префикс с той же группой маршрутов
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
в основном ссылку получить последний упомянутый префикс, независимо от выбранного в данный момент
Ответы
Ответ 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');