Laravel 4可选路径参数

时间:2013-09-17 09:55:02

标签: routing laravel

我想知道如何为控制器方法添加可选的路由参数:

目前我有一条路线,如下所示:

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');

感谢您的帮助。

2 个答案:

答案 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请求更容易处理。