Laravel-将资源路由覆盖到其他路由过滤器组中 [英] Laravel - Overriding a resource route into a different route filter group

查看:246
本文介绍了Laravel-将资源路由覆盖到其他路由过滤器组中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Laravel的路由似乎未按预期工作?据我了解,如果要覆盖一条路线,我要做的就是将期望的路线放在另一条路线之前.

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.

我所拥有的是这样的:

Route::group(array('before'=>'defaultLoads'), function(){
    Route::post('newsletter', 'NewsletterController@store');

    Route::group(array('before'=>'login'), function(){
        Route::resource('newsletter','NewsletterController');
    }
});

我以为如果我发布到此路由http://domain.com/newsletter,则应仅运行defaultLoads路由过滤器.

Which I assumed that if i post to this route http://domain.com/newsletter it should only run the defaultLoads route filter.

但是,当我运行php artisan routes时,我得到了:

However, when I run php artisan routes, I get this:

| | POST时事通讯| newsletter.store | NewsletterController @ store | defaultLoads,登录| |

| | POST newsletter | newsletter.store | NewsletterController@store | defaultLoads, login | |

尽管它可以正确读取路由(php artisan会在正确的位置加载正确的路由),但是资源路由的过滤器会影响该路由,即使它不在该过滤器组中也是如此.

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.

所以我的问题:

  1. Laravel是这样工作的吗?

  1. Is this how Laravel works?

如果是这样,我是否有可能在没有实际执行以下操作的情况下覆盖该POST->新闻通讯路线?

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
}});

推荐答案

在需要覆盖要匹配的实际路线的情况下,以这种方式实际覆盖是可行的.例如,当您需要使用带有硬编码的参数的参数覆盖路由时:

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

但是,对于您来说,您的路由定义是相同的(对于post请求,两者都必须与newsletter匹配).这意味着最后一个将覆盖第一个(以及当前上下文中应用于它的所有过滤器).因此,您应该在resource路由定义之后覆盖它:

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:

Route::group(array('before'=>'defaultLoads'), function()
{
    Route::group(array('before'=>'login'), function()
    {
        Route::resource('newsletter','NewsletterController');
    }

    Route::post('newsletter', 'NewsletterController@store');
});

您的artisan routes现在应该像这样:

POST newsletter | NewsletterController@store | | defaultLoads

这篇关于Laravel-将资源路由覆盖到其他路由过滤器组中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆