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.store | NewsletterController @ store | defaultLoads,登录| |
虽然它正确地读取了路线(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
}});
答案 0 :(得分:2)
实际上,以这种方式覆盖适用于需要覆盖匹配的实际路由的情况。例如,当您需要使用参数覆盖路径时,使用硬编码的东西:
Route::get('newsletter/custom', ...);
Route::get('newsletter/{param}', ...); // this is overriden by the first route
但是,在您的情况下,您的路由定义是相同的(对于newsletter
请求,两者必须匹配post
)。这意味着最后一个将覆盖第一个(以及当前上下文中应用于它的任何过滤器)。所以你应该在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