У меня есть следующий маршрут:
Route::get('users/search/{type?}/{value}', 'Site\UserController@search');
Основная идея заключается в упрощении поиска:
если тип существует (имя, фамилия, адрес электронной почты и т.д.), найдите только это поле.
если нет - поиск везде.
Но когда я сделаю:
http://example.com/users/search/sdgfdfxg
Броски Laravel
Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException
С
http://example.com/users/search/name/sdgfdfxg
или
http://example.com/users/search/surname/sdgfdfxg
Все отлично.
Yust определяет 2 маршрута:
Route::get('users/search/{type}/{value}',function($type,$value){
$app = app();
$controller = $app->make('Site\UserController');
$controller->callAction($app, $app['router'], 'search', $parameters = array($type,$value));
});
Route::get('users/search/{value}',function($value){
$app = app();
$controller = $app->make('Site\UserController');
$controller->callAction($app, $app['router'], 'search', $parameters = array(null,$value));
});
Но все же самый простой вариант - изменить порядок определения ваших параметров. Установите необязательный параметр в конец URL-адреса:
Route::get('users/search/{value}/{type?}','Site\UserController@search');
Во-первых, вы никогда не сможете сделать необязательный параметр первым. Необязательные параметры всегда являются последними в функции или URL-адресе.
Согласно документам, вы должны поставить рядом с ним вопросительный знак, например:
Route::get('users/search/{value}/{type?}', 'Site\UserController@search');
И в вашей функции поиска:
public function search($value, $type = null) {
// Handle your code here...
}
Я знаю, что кажется странным иметь URL-адрес со значением сначала, а затем тип... Если вас это беспокоит, я предлагаю вам использовать ответ от Peh.
Вы можете зарегистрировать 2 маршрута. Один с "типом" и один без обработки обоих случаев.
Route::get('users/search/{type}/{value}', 'Site\UserController@searchByType');
Route::get('users/search/{value}', 'Site\UserController@search');