5

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

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

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

谢谢你的帮助。

4

2 回答 2

11

可选参数需要位于 URL 的末尾。

所以你是一个明确的默认函数参数的不正确用法,如此所述。这就是您的代码无法按预期工作的原因。

您必须颠倒这两个参数的顺序或针对这些情况实施不同的方法,考虑到您需要某种前缀来区分它们:

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) {...}
于 2013-09-17T11:40:59.020 回答
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 请求更容易处理。

于 2013-09-27T11:04:48.673 回答