它的工作方式是在主页上我们向访客提供一些课程,如
>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
基本上链接获取最后提到的前缀,而不管当前选择的一个
答案 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');