我想知道如何为控制器方法添加可选的路由参数:
目前我有一条路线,如下所示:
Route::get('devices/{code}/{area}','HomeController@getDevices');
和控制器方法:
public function getDevices($code=NULL,$area) {...}
我的获取请求如下:
/devices/A/ABC
它工作正常,但我希望{code}参数是可选的,这样我就可以用不同的方式获取数据:
/devices//ABC or
/devices/ABC
我尝试过以下操作,但所有操作都失败了NotFoundHttpException
Route::get('devices/{code?}/{area}','HomeController@getDevices');
Route::get('devices/(:any?)/{area}','HomeController@getDevices');
感谢您的帮助。
答案 0 :(得分:10)
可选参数必须位于URL的末尾。
所以你的是默认使用默认函数参数,如here所述。 这就是您的代码无法正常工作的原因。
你必须扭转这两个参数的顺序或为这些情况实现不同的方法,考虑到你需要某种前缀来区分它们:
Route::get('devices/area/{area}','HomeController@getDevicesByArea');
Route::get('devices/code-and-area/{code}/{area}','HomeController@getDevicesByAreaAndCode');
public function getDevicesByAreaAndCode($area, $code = NULL) {...}
public function getDevicesByArea($area) {
return $this->getDevicesByAreaAndCode($area);
}
或者,如前所述,反转参数:
Route::get('devices/area-and-code/{area}/{code?}','HomeController@getDevicesByAreaAndCode');
public function getDevicesByAreaAndCode($area, $code = NULL) {...}
答案 1 :(得分:2)
如果需要,可以使用Laravel 4执行此操作,对于某些JSON调用可能会很方便,其中不在URI末尾的参数可能需要为空。
关键是专门为空参数设置路线。这条路线:
Route::get('devices//{area}','HomeController@getDevicesByArea');
将捕获URI“devices // myarea”并将其发送到:
public function getDevicesByArea($area) {...}
在提供代码的地方,主要路线可以捕获:
Route::get('devices/{code}/{area?}','HomeController@getDevicesByCode');
将代码和可选区域发送到:
public function getDevicesByArea($code, $area = '') {...}
这并不是说在这个例子中交换参数并不是更好的解决方案,特别是如果URL将由人类处理。但我只是在这里添加记录,原来请求的内容是可能的,并且可以使一些AJAX请求更容易处理。