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

Posted

技术标签:

【中文标题】Laravel - 将资源路由覆盖到不同的路由过滤器组【英文标题】:Laravel - Overriding a resource route into a different route filter group 【发布时间】:2015-01-11 16:41:55 【问题描述】:

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 routes 时,我得到了这个:

| |邮政通讯 | 时事通讯商店 |通讯控制器@store | 默认加载,登录 | |

虽然它正确读取了路由(php artisan 在正确的位置加载了正确的路由),但是资源路由的过滤器会影响路由,即使它不在该过滤器组中。

所以我的问题:

    这就是 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
    );
    

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我会试试这个。但是,根据文档,如果找到 2 条相同的路线,Laravel 将采用找到的第一条路线。为什么 Laravel 会采用这种情况下找到的最后一条路线? 太好了,很高兴我能帮上忙。您能否指出您在文档中找到有关相同路由优先级的信息的位置。文档有时会出现问题,如果是这种情况,我想报告一个问题。 对不起,我弄糊涂了。正是这篇文章说明了这一点-> ***.com/questions/22467677/…

以上是关于Laravel - 将资源路由覆盖到不同的路由过滤器组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 将参数从路由传递到过滤器

Laravel 4 过滤不同角色的组路由

将语言环境添加到 laravel 资源路由

Laravel 过滤路由

Laravel,路由通配符过滤然后控制器

在 Laravel 中:如何根据 URI 将多个过滤器应用于一整套路由?