php – Laravel – 将资源路由覆盖到不同的路由过滤器组

Laravel的路由似乎没有按预期工作?根据我的理解,如果我打算覆盖路线,我需要做的就是将预期路线放在另一条路线之前.

我所拥有的是这样的:

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路由过滤器.

但是,当我运行php artisan路线时,我得到了这个:

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

虽然它正确地读取路线(php工匠在正确的位置加载正确的路线)但资源路线的过滤器影响路线,即使它不在该过滤器组中.

所以我的问题:

>这是Laravel的工作原理吗?
>如果是这样,我是否可以在不实际执行以下操作的情况下覆盖POST->新闻稿路线?

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

最佳答案 实际上,以这种方式覆盖适用于需要覆盖匹配的实际路由的情况.例如,当您需要使用参数覆盖路由时,使用硬编码的内容:

Route::get('newsletter/custom', ...);
Route::get('newsletter/{param}', ...); // this is overriden by the first route

但是,在您的情况下,您的路由定义是相同的(两者都必须匹配发布请求的简报).这意味着最后一个将覆盖第一个(以及当前上下文中应用于它的任何过滤器).所以你应该在资源路由定义后覆盖它:

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

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

您的工匠路线现在应该如下所示:

POST newsletter | NewsletterController@store | | defaultLoads
点赞