Laravel - 将资源路由覆盖到不同的路由过滤器组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26927472/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Laravel - Overriding a resource route into a different route filter group
提问by He Hui
Laravel's routing doesn't seem to be working as expected? From what I understand, if I intend to override a route, all I need to do is to put the expected route before the other one.
Laravel 的路由似乎没有按预期工作?据我所知,如果我打算覆盖一条路线,我需要做的就是将预期的路线放在另一条路线之前。
What I have is something like this:
我所拥有的是这样的:
Route::group(array('before'=>'defaultLoads'), function(){
Route::post('newsletter', 'NewsletterController@store');
Route::group(array('before'=>'login'), function(){
Route::resource('newsletter','NewsletterController');
}
});
Which I assumed that if i post to this route http://domain.com/newsletter
it should only run the defaultLoads route filter.
我假设如果我发布到这条路线,http://domain.com/newsletter
它应该只运行 defaultLoads 路线过滤器。
However, when I run php artisan routes
, I get this:
但是,当我运行时php artisan routes
,我得到了这个:
| | POST newsletter | newsletter.store | NewsletterController@store | defaultLoads, login | |
| | 邮政通讯 | newsletter.store | NewsletterController@store | defaultLoads, 登录 | |
Although it reads the route correctly (php artisan loads that correct route in the correct place) but the resource route's filter affected the route even when it's not in that filter group.
尽管它正确读取了路由(php artisan 在正确的位置加载了正确的路由),但是资源路由的过滤器会影响该路由,即使它不在该过滤器组中。
So my question:
所以我的问题:
Is this how Laravel works?
If so, is it possible for me to override that POST->newsletter route without actually doing the following?
Route::group(array('before'=>'defaultLoads'), function(){ Route::post('newsletter', 'NewsletterController@store'); Route::group(array('before'=>'login'), function(){ Route::get('newsletter','NewsletterController@get'); Route::get('newsletter/{id}', 'NewsletterController@show'); //etc all the rest of the routes except post }});
这是 Laravel 的工作方式吗?
如果是这样,我是否可以在不实际执行以下操作的情况下覆盖该 POST->newsletter 路由?
Route::group(array('before'=>'defaultLoads'), function(){ Route::post('newsletter', 'NewsletterController@store'); Route::group(array('before'=>'login'), function(){ Route::get('newsletter','NewsletterController@get'); Route::get('newsletter/{id}', 'NewsletterController@show'); //etc all the rest of the routes except post }});
采纳答案by Bogdan
Actually overriding in that way works in cases where you need to override the actual route that is being matched. For example when you need to override a route with a parameter, with something hardcoded:
在您需要覆盖正在匹配的实际路由的情况下,实际上以这种方式覆盖是有效的。例如,当您需要使用参数覆盖路由时,使用硬编码:
Route::get('newsletter/custom', ...);
Route::get('newsletter/{param}', ...); // this is overriden by the first route
In your case however, your route definitions are identical (both must match newsletter
for a post
request). That means that the last one will override the first one (and any filters applied to it in the current context). So you should be overrding it after the resource
route definition:
在你的情况然而,你的路由定义是相同的(两者必须匹配newsletter
的post
要求)。这意味着最后一个将覆盖第一个(以及在当前上下文中应用于它的任何过滤器)。所以你应该在resource
路由定义之后覆盖它:
Route::group(array('before'=>'defaultLoads'), function()
{
Route::group(array('before'=>'login'), function()
{
Route::resource('newsletter','NewsletterController');
}
Route::post('newsletter', 'NewsletterController@store');
});
Your artisan routes
for it should look like this now:
你的artisan routes
for 它现在应该是这样的:
POST newsletter | NewsletterController@store | | defaultLoads