He *_*Hui 5 php laravel laravel-4 laravel-routing
Laravel 的路由似乎没有按预期工作?据我了解,如果我打算覆盖一条路线,我需要做的就是将预期路线放在另一条路线之前。
我所拥有的是这样的:
Route::group(array('before'=>'defaultLoads'), function(){
Route::post('newsletter', 'NewsletterController@store');
Route::group(array('before'=>'login'), function(){
Route::resource('newsletter','NewsletterController');
}
});
Run Code Online (Sandbox Code Playgroud)
我假设如果我发布到这条路线,http://domain.com/newsletter它应该只运行 defaultLoads 路线过滤器。
但是,当我运行时php artisan routes,我得到了这个:
| | 邮政通讯 | newsletter.store | NewsletterController@store | defaultLoads, 登录 | |
尽管它正确读取了路由(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
}});
Run Code Online (Sandbox Code Playgroud)实际上,在您需要覆盖正在匹配的实际路由的情况下,以这种方式覆盖是有效的。例如,当您需要使用硬编码的参数覆盖路由时:
Route::get('newsletter/custom', ...);
Route::get('newsletter/{param}', ...); // this is overriden by the first route
Run Code Online (Sandbox Code Playgroud)
但是,在您的情况下,您的路由定义是相同的(两者都必须newsletter与post请求匹配)。这意味着最后一个将覆盖第一个(以及在当前上下文中应用于它的任何过滤器)。所以你应该在resource路由定义之后覆盖它:
Route::group(array('before'=>'defaultLoads'), function()
{
Route::group(array('before'=>'login'), function()
{
Route::resource('newsletter','NewsletterController');
}
Route::post('newsletter', 'NewsletterController@store');
});
Run Code Online (Sandbox Code Playgroud)
你的artisan routesfor 现在应该是这样的:
POST newsletter | NewsletterController@store | | defaultLoads
Run Code Online (Sandbox Code Playgroud)