it-swarm.com.de

Wie man GET-Parameter mit der GET-Methode an Laravel übergibt?

ich bleibe bei dieser sehr grundlegenden Form, die ich nicht erreichen konnte, die ich mit einer Texteingabe und zwei Auswahlsteuerelementen mit einer Route, die 3 Parameter akzeptiert, erstellen möchte bilden sie die Parameter mit dem Fragezeichen ab, nicht die Laravel-Methode, 

Markup

{{ Form::open(['route' => 'search', 'method' => 'GET'])}}
    <input type="text" name="term"/>
    <select name="category" id="">
        <option value="auto">Auto</option>
        <option value="moto">Moto</option>
    </select>
    {{ Form::submit('Send') }}
{{ Form::close() }}

Route

    Route::get('/search/{category}/{term}', ['as' => 'search', 'uses' => '[email protected]']);

Wenn ich das Formular übermittle, leite es mich weiter 

search/%7Bcategory%7D/%7Bterm%7D?term=asdasd&category=auto

Wie kann ich diese Parameter mit dem Laravel-Weg und ohne Javascript an meine Route übergeben? : D

21
Iliyass Hamza

Am einfachsten ist es, die eingehende Anfrage zu akzeptieren und die gewünschten Variablen aus dem Controller herauszuholen:

Route::get('search', ['as' => 'search', 'uses' => '[email protected]']);

und dann in [email protected]:

class SearchController extends BaseController {

    public function search()
    {
        $category = Input::get('category', 'default category');
        $term = Input::get('term', false);

        // do things with them...
    }
}

Nützlicherweise können Sie Standardwerte festlegen in Input::get() } _ festlegen, falls nichts an die Aktion Ihres Controllers übergeben wird.

Wie Joe_archer sagt , ist es nicht notwendig, diese Begriffe in die URL einzufügen, und es ist möglicherweise besser als POST (in diesem Fall sollten Sie Ihren Aufruf an Form::open() und auch aktualisieren Ihre Suchroute in routes.php - Input::get() bleibt gleich)

26
msturdy

Ich hatte auch damit zu kämpfen und bekam es endlich zum Laufen.

routen.php

Route::get('people', '[email protected]');
Route::get('people/{lastName}', '[email protected]');
Route::get('people/{lastName}/{firstName}', '[email protected]');
Route::post('people', '[email protected]');

PeopleController.php

namespace App\Http\Controllers ;
use DB ;
use Illuminate\Http\Request ;
use App\Http\Requests ;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;

    public function processForm() {
        $lastName  = Input::get('lastName') ;
        $firstName = Input::get('firstName') ;
        return Redirect::to('people/'.$lastName.'/'.$firstName) ;
    }
    public function show($lastName,$firstName) {
        $qry = 'SELECT * FROM tableFoo WHERE LastName LIKE "'.$lastName.'" AND GivenNames LIKE "'.$firstName.'%" ' ;
        $ppl = DB::select($qry);
        return view('people.show', ['ppl' => $ppl] ) ;
    }

menschen/show.blade.php

<form method="post" action="/people">
    <input type="text" name="firstName" placeholder="First name">
    <input type="text" name="lastName" placeholder="Last name">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="submit" value="Search">
</form>

Anmerkungen:
Ich musste zwei Eingabefelder an den URI übergeben.
Ich benutze Eloquent noch nicht. Wenn Sie dies tun, passen Sie die Datenbanklogik entsprechend an.
Und ich bin noch nicht fertig damit, die vom Benutzer eingegebenen Daten zu sichern, also chill.
.__ Beachten Sie das ausgeblendete Formularfeld "_token" und alle "use" -Einträge, die benötigt werden. 

PS: Hier ist eine andere Syntax, die zu funktionieren scheint und die nicht benötigt

use Illuminate\Support\Facades\Input;

.

public function processForm(Request $request) {
    $lastName  = addslashes($request->lastName) ;
    $firstName = addslashes($request->firstName) ;
    //add more logic to validate and secure user entered data before turning it loose in a query
    return Redirect::to('people/'.$lastName.'/'.$firstName) ;
}
16
birchy

Ich hatte das gleiche Problem. Ich brauche eine URL für eine Suchmaschine

Ich benutze zwei Routen wie diese

Route::get('buscar/{nom}', '[email protected]');

Route::post('buscar', function(){

   $bsqd = Input::get('nom');    

   return Redirect::action('[email protected]', array('nom'=>$bsqd));

});

Zuerst wurde URL verwendet, wie wir wollen

Zweites Element, das von Formular verwendet wird, und zum ersten weiterleiten

7
Fabian M

Eine Alternative zu msturdys Lösung verwendet die request-Hilfsmethode , die Ihnen zur Verfügung steht.

Dies funktioniert auf die gleiche Weise, ohne dass der Input-Namespace use Illuminate\Support\Facades\Input oben in Ihrem Controller importiert werden muss.

Zum Beispiel:

class SearchController extends BaseController {

    public function search()
    {
        $category = request('category', 'default');
        $term = request('term'); // no default defined

        ...
    }
}
4
Jonathan

Sie versuchen also, den Suchbegriff und die Kategorie in die URL aufzunehmen?

Ich würde davon abraten, da Sie sich mit Mehrwort-Suchbegriffen usw. auseinandersetzen müssen und bei unzulässigen Zeichen mit allerlei Unannehmlichkeiten enden könnten.

Ich würde vorschlagen, die Daten zu POSTen, zu desinfizieren und dann eine Ergebnisseite zurückzugeben.

Das Laravel-Routing ist nicht für die Annahme von GET-Anforderungen aus Formularen konzipiert. Es dient dazu, URL-Segmente als Abrufparameter zu verwenden und basiert auf dieser Idee.

3
Joe

Alternativ, wenn Sie erwartete Parameter in der Aktionssignatur angeben möchten, diese aber als beliebige GET-Argumente übergeben. Verwenden Sie zum Beispiel Filter:

Erstellen Sie eine Route ohne Parameter:

$Route::get('/history', ['uses'=>'[email protected]']);

Geben Sie die Aktion mit zwei Parametern an und hängen Sie den Filter an:

class ExampleController extends BaseController
{
    public function __construct($browser)
    {
        $this->beforeFilter('filterDates', array(
            'only' => array('history')
        ));
    }

    public function history($fromDate, $toDate)
    {
        /* ... */
    }

}

Filter, der GET in die Argumente der Aktion übersetzt:

Route::filter('filterDates', function($route, Request $request) {
    $notSpecified = '_';

    $fromDate = $request->get('fromDate', $notSpecified);
    $toDate = $request->get('toDate', $notSpecified);

    $route->setParameter('fromDate', $fromDate);
    $route->setParameter('toDate', $toDate);
});
0
b.b3rn4rd

Router

Route::get('search/{id}', ['as' => 'search', 'uses' => '[email protected]']);

Regler

class SearchController extends BaseController {

    public function search(Request $request){

        $id= $request->id ; // or any params

        ...
    }
}
0
Ayoub Bousetta