2016-09-26 1 views
-1

Ich habe ein Formular, wo ein Benutzer einen Startort eingeben kann, beim Einreichen geht er auf eine Karte, die auf diesen Ort zentriert ist. Er kann diesen Schritt auch überspringen und direkt zur Karte gehen. (Dies ist die vereinfachte Version, um die ganze Hintergrundstory zu überspringen)Laravel zeigt den Parameternamen anstelle des Wertes (bei Verwendung optionaler Parameter in der Route)

Dies ist das erste Stück Code, wenn der Benutzer das Formular verwendet hat, wird es den Startort aus dem Formular übernehmen und auf die Karte umleiten: (egal die Planung variabel, es wird immer für die Zwecke dieser Fall) ‚eigenen‘ sein

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

Dies ist die Karte Route ist die Startlocation optional wie oben erläutert. (Der API-Schlüssel wäre mein persönlicher API-Schlüssel.) Was ich hier sehe, ist, dass die Debugbar 'startLocation' anstelle des Wertes des Parameters anzeigt. (Name statt Wert)

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); 
}]); 

Ich begann mit der URL zu spielen, um zu sehen, was los war. Unter der Annahme der Benutzer 'Miami' eingegeben als Startlocation dies in folgenden URL zur Folge hätte:

http://laravel.dev/Map/startLocation?Miami => DebugBar

'Startlocation' zeigen würde, wenn ich die URL selbst http://laravel.dev/Map/Miami => DebugBar ändern würde zeigen, ‚Miami '

Es ist nicht nur Debugbar, die falsche Inhalte zeigen würde. Ich versuche, basierend auf dieser Variablen zu geocodieren, und es schlägt fehl, weil es den Inhalt auch als 'startLocation' ansieht.

Ich kann dieses Problem möglicherweise lösen, indem ich zwei Routen erstelle, eine mit und eine ohne Parameter, aber ich denke, ich vermisse gerade etwas Offensichtliches.

+0

Warum verwenden Sie "?" in Routen, entfernen Sie diese –

+1

@ImtiazPabel Das '?' bedeutet, dass der Parameter route optional und absolut gültig ist. – Jonathon

+0

Beachten Sie, dass die Parameter der Route nicht mit denen der Parameter 'GET' übereinstimmen (aus der Abfragezeichenfolge, die in der URL nach '?' Folgt). '/ Map/Miami' würde" Miami "' für '$ startLocation' korrekt zurückgeben, das gleiche wie'/Map/startlocation? Miami' würde '' startLocation "' für '$ startLocation' korrekt anzeigen. So ziemlich Sie versuchen, URL und 'GET' Parameter zu verwenden, wenn Sie wirklich nur einen auswählen sollten. –

Antwort

0

Sie haben einen Fehler Anruf innerhalb Ihrer Route

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

Sollte dies sein:

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

Sie müssen keine Taste im Routenaufruf angeben, das Array wird mit Parametern in der gegebenen Route basierend auf ihrer Position im Array gepaart, z. erstes Element in Array zu erstem Parameter in Route, zweites Element in Array zu zweitem Parameter in Route usw.

+1

Um es etwas übersichtlicher zu machen, ist die Verwendung von Schlüsseln in Ordnung, aber die Art und Weise, wie es versucht wurde, ist immer noch falsch. 'array ('startLocation' => Eingabe :: get ('startLocation'))' – user3158900

+0

Ich wollte das ursprünglich empfehlen, aber meine Lösung benötigt weniger Code :) Beide sind natürlich korrekt. –

+0

Danke, löste mein Problem! – DiscoFever

0

Ihre Routen funktionieren wie erwartet. Denken Sie daran, dass {startLocation?} nicht Teil der URL ist, aber ein Platzhalter durch den tatsächlichen Wert des Parameters ersetzt wird.

Daher Ihre Route :: get ('Karte/{startLocation?}', ...); Route sagt, dass startLocation Parameter Wert ist, was auch immer kommt nach der Karte/. Also, wenn Sie gehen zu Map/startLocation? Miami, startLocation Zeichenfolge wird als der Wert des Parameters genommen. ?

Der einfachste Weg, um beide /Karte und /Karte/Startlocation Miami URLs dienen zwei Routen definieren:

Route::get('Map', ...); 
Route::get('Map/startLocation?{startLocation}', ...); 
Verwandte Themen