Дополнительный параметр Laravel 4

Я хотел бы знать, как маршрутизировать необязательный параметр для метода контроллера

В настоящее время у меня есть маршрут ниже:

Route::get('devices/{code}/{area}','[email protected]');

и метод контроллера:

public function getDevices($code=NULL,$area) {...}

Мой запрос будет выглядеть так:

/devices/A/ABC

Он работает нормально, но теперь я хочу сделать параметр {code} необязательным, чтобы я мог получать данные по-разному, как показано ниже:

/devices//ABC or 
/devices/ABC

Я пробовал следующие изменения, но все не удалось с NotFoundHttpException

Route::get('devices/{code?}/{area}','[email protected]'); Route::get('devices/(:any?)/{area}','[email protected]');

Спасибо за вашу помощь.

Ответ 1

Это явное неправильное использование аргументов функции по умолчанию, как описано здесь. Именно по этой причине ваш код не работает, как вы ожидаете.

Вам придется изменить порядок этих двух параметров или реализовать разные методы для этих случаев, принимая во внимание, что для их дифференциации вам понадобится какой-то префикс:

Route::get('devices/area/{area}','[email protected]');
Route::get('devices/code-and-area/{code}/{area}','[email protected]');

public function getDevicesByAreaAndCode($area, $code = NULL) {...}
public function getDevicesByArea($area) { 
    return $this->getDevicesByAreaAndCode($area);
}

ИЛИ, как я уже говорил, измените параметры:

Route::get('devices/area-and-code/{area}/{code?}','[email protected]');

public function getDevicesByAreaAndCode($area, $code = NULL) {...}

Ответ 2

Вы можете сделать это с помощью Laravel 4, если хотите, и может быть удобно для некоторых вызовов JSON, где параметр, который не находится в конце URI, может быть пустым.

Ключ настраивает маршрут специально для пустого параметра. Этот маршрут:

Route::get('devices//{area}','[email protected]');

поймает URI "устройства//myarea" и отправит его по адресу:

public function getDevicesByArea($area) {...}

Если код поставлен, основной маршрут может поймать следующее:

Route::get('devices/{code}/{area?}','[email protected]');

отправка кода и дополнительной области:

public function getDevicesByArea($code, $area = '') {...}

Это не означает, что замена параметров в этом примере не является лучшим решением, особенно если URL-адрес будет обрабатываться человеком. Но я просто добавляю к записи, что то, что было изначально запрошено, возможно, и может облегчить обработку некоторых запросов AJAX.