未调用Laravel资源控制器方法

时间:2018-06-04 07:35:11

标签: laravel controller routing laravel-5.6

我有控制器LeadsControllerLeadsAttributesControllerLeadsReminderController

Route::resource('leads' , 'LeadsController');
Route::prefix('leads')->group(function(){
    Route::resource('attributes' , 'LeadAttributesController' , ['as' => 'leads']);
    Route::resource('reminders' , 'LeadRemindersController' , ['as' => 'leads']);
});

当我转到/leads/attributes时,框架应调用索引函数,但在这种情况下,会出现一个空白页面,并且不会显示任何异常。但是,/leads/attributes/create的路由可以正常工作。

如果路由重构如下,那么路由工作正常

Route::prefix('leads')->group(function(){
    Route::resource('attributes' , 'LeadAttributesController' , ['as' => 'leads']);
    Route::resource('reminders' , 'LeadRemindersController' , ['as' => 'leads']);
});
Route::resource('leads' , 'LeadsController');

任何人都可以解释这种框架的行为吗?

1 个答案:

答案 0 :(得分:1)

解决这个问题的方法是将LeadsController路由放在组路由下:

Route::prefix('leads')->group(function(){
    Route::resource('attributes' , 'LeadAttributesController' , ['as' => 'leads']);
    Route::resource('reminders' , 'LeadRemindersController' , ['as' => 'leads']);
});
Route::resource('leads' , 'LeadsController');

您必须这样做的原因是因为leads节目路线的通配符将接受任何默认值。当laravel收到请求时,它会尝试将其匹配到第一条路径,因为您的leads资源高于嵌套资源,它将与lead的show方法匹配,而不是正确的嵌套资源。