gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:30:46 25 4
gpt4 key购买 nike

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

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

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

所以我的问题是:

  1. 这就是 Laravel 的工作方式吗?

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

最佳答案

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

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

关于php - Laravel - 将资源路由覆盖到不同的路由过滤器组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26927472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com