我在路线文件中设置了以下内容
Route::resource('reports', 'CampaignReport\CampaignReportController');
Route::get('reports/generateExcel', array('as' => 'reports.generateExcel', 'uses' => 'CampaignReport\CampaignReportController@generateExcel'));
我没有把它绑定到模型,因为它只是用于创建通用报告。如果我输出我的路线,我看到(我删除了一些常见的路线)
| | GET|HEAD | reports | reports.index | App\Http\Controllers\CampaignReport\CampaignReportController@index | auth
| | GET|HEAD | reports/create | reports.create | App\Http\Controllers\CampaignReport\CampaignReportController@create | auth
| | GET|HEAD | reports/generateExcel | reports.generateExcel | App\Http\Controllers\CampaignReport\CampaignReportController@generateExcel | auth
| | GET|HEAD | reports/{reports} | reports.show | App\Http\Controllers\CampaignReport\CampaignReportController@show | auth
所以一切看起来都很好。现在在我的一个观点中,我有以下
<td>{!! link_to_route('reports.generateExcel', 'Generate Excel', null, array('class' => 'btn btn-info')) !!}</td>
所以这应该在我的控制器中触发generateExcel函数。目前,我的控制器是这样的
public function show()
{
return "SHOW PAGE";
}
public function generateExcel()
{
return "EXCEL GENERATED";
}
现在奇怪的是,由于某种原因,路由链接返回SHOW PAGE,它应该返回EXCEL GENERATED。但是,如果我在路线上进行更改并删除节目路线,例如
Route::resource('reports', 'CampaignReport\CampaignReportController', ['except' => ['show']]);
与路线相同的链接现在也会显示它应该是什么,这是EXCEL GENERATED。
那么为什么会在第一个实例中调用show函数?
由于
答案 0 :(得分:2)
因为reports/generateExcel
与show
路由reports/{reports}
的模式匹配。如果您更改控制器以显示{reports}
的值,例如
public function show($id)
{
return "SHOW PAGE for '$id'";
}
然后你会在输出中看到SHOW PAGE for 'generateExcel'
。
根据文档,解决方案是在<{em> Route::resource()
之前简单地注册您的自定义路线:
补充资源控制器
如果有必要向资源添加其他路由 超出默认资源路由的控制器,您应该定义那些 致电
Route::resource
之前的路线;否则,路线resource
方法定义的方法可能无意中优先 在你的补充路线上
https://laravel.com/docs/5.2/controllers#restful-supplementing-resource-controllers