web-dev-qa-db-fra.com

Comment passer des paramètres GET à Laravel à partir de la méthode GET?

je suis coincé à ce formulaire très basique, que je ne pourrais pas accomplir, ce que je veux construire un formulaire de recherche avec une entrée de texte et deux contrôles de sélection, avec une route qui accepte 3 paramètres, forme, il mappe les paramètres avec le point d'interrogation, pas la manière de Laravel, 

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' => 'SearchController@search']);

Lorsque je soumets le formulaire, il me redirige vers 

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

Comment puis-je passer ces paramètres sur mon itinéraire avec la manière Laravel et sans Javascript! :RÉ

21
Iliyass Hamza

Le moyen le plus simple consiste simplement à accepter la demande entrante et à extraire les variables souhaitées dans le contrôleur:

Route::get('search', ['as' => 'search', 'uses' => 'SearchController@search']);

puis dans SearchController@search:

class SearchController extends BaseController {

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

        // do things with them...
    }
}

Utilement, vous pouvez définir les valeurs par défaut dans Input::get() au cas où rien ne serait transmis à l'action de votre contrôleur.

Comme le dit joe_archer , il n'est pas nécessaire de mettre ces termes dans l'URL, et cela pourrait être mieux comme POST] (dans ce cas, vous devez mettre à jour votre appel à Form::open() et également votre itinéraire de recherche dans les itinéraires. php - Input::get() reste le même)

26
msturdy

Je me débattais aussi avec ce problème et je l'ai finalement fait fonctionner.

routes.php

Route::get('people', 'PeopleController@index');
Route::get('people/{lastName}', 'PeopleController@show');
Route::get('people/{lastName}/{firstName}', 'PeopleController@show');
Route::post('people', 'PeopleController@processForm');

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

people/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>

Remarques:
Je devais passer deux champs d'entrée dans l'URI.
Je n'utilise pas encore Eloquent, si c'est le cas, ajustez la logique de base de données en conséquence.
Et je n'ai pas fini de sécuriser les données entrées par l'utilisateur, alors refroidissez-vous.
Faites attention au champ de formulaire masqué "_token" et à tous les "utilisations" inclus, ils sont nécessaires. 

PS: Voici une autre syntaxe qui semble fonctionner et qui n’a pas besoin de la

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

J'ai eu le même problème. J'ai besoin de montrer l'URL d'un moteur de recherche

J'utilise deux itinéraires comme celui-ci

Route::get('buscar/{nom}', 'FrontController@buscarPrd');

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

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

   return Redirect::action('FrontController@buscarPrd', array('nom'=>$bsqd));

});

Le premier utilisé pour afficher l'URL que nous voulons

Deuxième utilisé par le formulaire et redirigé vers le premier

7
Fabian M

Une alternative à la solution de msturdy consiste à utiliser la méthode d'assistance request à votre disposition.

Cela fonctionne exactement de la même manière, sans qu'il soit nécessaire d'importer le Input namespace use Illuminate\Support\Facades\Input en haut de votre contrôleur.

Par exemple:

class SearchController extends BaseController {

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

        ...
    }
}
4
Jonathan

Vous essayez donc d’obtenir le terme de recherche et la catégorie dans l’URL?

Je vous déconseillerais cela, car vous devrez vous attaquer à des termes de recherche multi-mots, etc.

Je suggérerais de poster les données, de les désinfecter puis de retourner une page de résultats.

Le routage Laravel n'est pas conçu pour accepter les demandes GET des formulaires, il est conçu pour utiliser les segments d'URL en tant que paramètres d'obtention et repose sur cette idée.

3
Joe

Vous pouvez également spécifier les paramètres attendus dans la signature d'action, mais les transmettre en tant qu'arguments GET arbitraires. Utilisez des filtres, par exemple:

Créez un itinéraire sans paramètres:

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

Spécifiez l'action avec deux paramètres et attachez le filtre:

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

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

}

Filtre qui traduit GET en arguments de l'action:

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