Laravel 4 Необязательный параметр маршрута
Я хотел бы знать, как добавить необязательный параметр маршрута для метода контроллера:
В настоящее время у меня есть маршрут, показанный ниже:
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 ответа
Необязательный параметр должен быть в конце 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) {...}
Вы можете сделать это с Laravel 4, если хотите, и это может быть удобно для некоторых вызовов JSON, когда параметр, не находящийся в конце URI, возможно, должен быть пустым.
Ключ настраивает маршрут специально для пустого параметра. Этот маршрут:
Route::get('devices//{area}','HomeController@getDevicesByArea');
перехватит URI "устройства //myarea" и отправит его по адресу:
public function getDevicesByArea($area) {...}
Там, где указан код, основной маршрут может поймать это:
Route::get('devices/{code}/{area?}','HomeController@getDevicesByCode');
отправив код и дополнительную область:
public function getDevicesByArea($code, $area = '') {...}
Это не означает, что обмен параметрами вокруг в этом примере не является лучшим решением, особенно если URL будет обрабатываться человеком. Но я просто добавляю для записи, что то, что первоначально запрашивалось, возможно, и может облегчить обработку некоторых запросов AJAX.