路由中的奇怪结果

时间:2016-03-30 14:01:43

标签: laravel laravel-5 laravel-routing

我在路线文件中设置了以下内容

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函数?

由于

1 个答案:

答案 0 :(得分:2)

因为reports/generateExcelshow路由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