Laravel - overriding resource route to another route filter group

Laravel routing not working as expected? From what I understand, if I intend to redefine a route, all I have to do is put the expected route in front of another.

I have something like this:

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

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

      

What I assumed is that if I post to this route http://domain.com/newsletter

it should trigger the defaultLoads route filter.

However, when I run php artisan routes

, I get the following:

| | POST Newsletter | News | NewsletterController @ shop | defaultLoads, login | |

Although it reads the route correctly (php artisan loads the correct route in the right place), but the resource route filter affected the route even if it is not in that filter group.

So my question is:

  • How does Laravel work?

  • If so, is it possible for me to override this POST-> mailing 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
    }});
    
          

+3


source to share


1 answer


In fact, overriding this way works in cases where you need to override the actual route that matches. For example, when you need to redefine a route with a parameter, with something hardcoded:

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

      

In your case, however, the route definitions are identical (both must match newsletter

for the request post

). This means that the latter will override the former (and any filters applied to it in the current context). Therefore, you must overcome this value after defining the route resource

:



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

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

      

Yours artisan routes

for this should look like this:

POST newsletter | NewsletterController@store | | defaultLoads

      

+1


source







All Articles