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它应该只运行默认的 Loads 路由过滤器。

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

| |邮政通讯 | newsletter.store |NewsletterController@store | 默认加载,登录 | |

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

所以我的问题:

  1. 这就是拉拉维尔的工作方式吗?

  2. 如果是这样,我是否可以在不实际执行以下操作的情况下覆盖该 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

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

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

最新更新