я пишу довольно простой сайт для школы … на этом сайте есть новости, статьи, видеоклипы … и т. д.
как это работает, на домашней странице мы представляем посетителю некоторые уроки, например
>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');