2016-09-26 1 views
-1

У меня есть форма, в которой пользователь может ввести начальное местоположение, при отправке он отправится на карту с центром в этом месте. Он также может просто пропустить этот шаг и перейти на карту напрямую. (это упрощенная версия, чтобы пропустить весь фоновый рассказ)Laravel показывает имя параметра вместо значения (при использовании необязательного параметра в маршруте)

Это первый фрагмент кода, когда пользователь использовал форму, в которой он примет начальное местоположение из формы и перенаправляется на карту: (неважно переменная планирования, оно всегда будет «своим» для целей настоящего дела)

Route::post('InitiateUserTrip', ['as' => 'InitiateUserTrip', function(WelcomeFormRequest $request) 
{ 
    if (Input::get('planning') == 'own') { 
     return Redirect::route('Map',array('startLocation', Input::get('startLocation'))); 
    } else { 
     return view('welcome'); 
    } 
} ]); 

Это карта маршрут, startLocation не является обязательным, как описано выше. (API-ключ был бы моим личным API-интерфейсом API.) Что я вижу здесь, так это то, что debugbar показывает «startLocation» вместо значения параметра. (имя вместо значения)

Route::get('Map/{startLocation?}', ['as' => 'Map', function($startLocation = null) 
{ 
    $map = new Map('API KEY',$startLocation,'GMainMap');  
    $googleMap = $map->getMap(); 
    $node = new Node(); 
    $node->loadBySelection('ALL'); 
    $nodes = $node->getNodes(); 
    \Debugbar::info("Map: " . $startLocation); 
    return View::make('map')->with('map', $googleMap) 
          ->with('nodes',$nodes) 
          ->with('startLocation',$startLocation); 
}]); 

Я начал играть с URL-адресом, чтобы узнать, что происходит. Предполагая, что пользователь ввел «Майами», как startLocation это приведет к следующему URL-адресу:

http://laravel.dev/Map/startLocation?Miami => DebugBar покажет «startLocation»

Когда я модифицировать URL-адрес себя http://laravel.dev/Map/Miami => DebugBar бы показать «Майами '

Это не просто Debugbar, который будет показывать неправильное содержимое. Я пытаюсь геокодировать на основе этой переменной, и она терпит неудачу, потому что она видит содержимое как «startLocation».

Возможно, я смогу решить эту проблему, создав два маршрута: один с одним и без параметров, но, полагаю, я просто пропустил что-то очевидное.

+0

Почему вы используете "?" в маршрутах, удалите это –

+1

@ImtiazPabel. '' 'означает, что параметр маршрута является необязательным и полностью действительным. – Jonathon

+0

Следует иметь в виду, что параметры маршрута не совпадают с параметрами 'GET' (из строки запроса, следующей за'? 'В URL-адресе). '/ Map/Miami' верно вернет' 'Майами'' для' $ startLocation', то же самое, что '/ Map/startloaction? Miami' будет * правильно * показать' "startLocation" 'для' $ startLocation'. В значительной степени вы пытаетесь использовать как URL, так и параметры GET, когда вам действительно нужно просто выбрать один. –

ответ

0

У Вас есть ошибка в вашем маршруте вызова

Redirect::route('Map',array('startLocation', Input::get('startLocation'))); 

Должно быть:

Redirect::route('Map',array(Input::get('startLocation'))); 

Вам не нужно указывать ключ в вызове маршрута, массив сопряжен с параметрами в заданном маршруте на основе их позиции в массиве, например. первый элемент в массиве - первый параметр в маршруте, второй элемент в массиве - второй параметр в маршруте и т. д.

+1

Просто, чтобы сделать его более понятным, использование ключей в порядке, но способ, которым он был предпринят, по-прежнему не так. 'array ('startLocation' => Input :: get ('startLocation'))' – user3158900

+0

Я изначально хотел это посоветовать, но для моего решения требуется меньше кода :) Оба правильны, конечно. –

+0

Спасибо, решил мою проблему! – DiscoFever

0

Ваши маршруты работают должным образом. Имейте в виду, что {startLocation?} не является частью URL-адреса, а заполнителем, который будет , заменяется фактическим значением параметра.

Таким образом, ваш Маршрут :: get ('Map/{startLocation?}', ...); маршрут говорит, что startLocation Значение параметра - это то, что приходит сразу после Карта/. Итак, если вы идете на Map/startLocation? Miami, startLocation string принимается за значение параметра. ?

Самый простой способ служить как /Карта и /Карта/startLocation Майами URL, чтобы определить 2 маршрута:

Route::get('Map', ...); 
Route::get('Map/startLocation?{startLocation}', ...); 
Смежные вопросы