Bjour,

je cherche qques conseils pour la mise en place d'un moteur de recherche sur un site développé en laravel (pas de elastic pour l'instant).
je n'arrive pas à utiliser les routes et controller correctement

l'idée est d'avoir un bloc formulaire prenant un paramètre input de type search
et que sa valeur soit passée au controller SearchController avec une fonction recherche.

j'ai créé un model et un controller Search.
j'ai ma vue :

<form method="get" action="{{ action('SearchController@recherche') }}" class="navbar-search pull-left">around    <input name="termerecherche" type="search" class="search-query" placeholder="Chercher">around</form>

mais je bloque car avec tous mes tests, j'ai des urls pas belles et tout passe par la fct show...

merci

9 réponses


betaWeb
Réponse acceptée

La function resource de la classe Route te génère automatiquement des routes du style '/search/1', '/search/edit/1' ... mais dans ton cas ce n'est pas approprié puisque logiquement ton SearchController ne contiendra qu'une méthode recherche() que tu appelera uniquement en GET (pas besoin de POST ici). A moins que tu aies prévu une archi différente ?

Hello,

Peux-tu nous montrer ton fichier routes.php ainsi que ton controller (SearchController) ?

Salut,

Essayes de nommer ta route :

/* Dans ton router */
Route::get('/search', ['uses' => 'SearchController@recherche', 'as' => 'search']);

/* Dans ton template */
<form method="get" action="{{ route('search') }}" class="navbar-search pull-left">
    <input name="q" type="search" class="search-query" placeholder="Rechercher">
</form>

/* Dans ton SearchController */
public function recherche(Request $request) { /* N'oublies pas d'importer la classe correspondant à la Facade Request */
    dd($request->all()); // Tu vérifies si tu récupères bien ta variable q.
}
_Nico_13
Auteur

Merci ça fonctionne.

c'était un pb au niveau de la route.

ce code là seul :

Route::resource('search', 'SearchController');

ne suffisait pas, il fallait aussi :

Route::post('search', 'SearchController@recherche');

(donc si on définit une fct particulière il faut l'indiquer en plus dans le route.php ?)

_Nico_13
Auteur

Merci betaWeb pour la précision.
en fait j'ai mis en post comme ça je n'ai pas le terme dans l'url (je trouve cela plus propre) et je mets la valeur en session pour la réafficher dans la zone.

et du coup j'ai enlevé

Route::resource('search', 'SearchController');

qui ne me sert pas.

D'accord :)
Après pour une recherche c'est plus commode de mettre la query string en GET, m'enfin ça tu fais comme tu veux ^^

_Nico_13
Auteur

plus commode pour quelle raison par exemple ?
référencement ?

Non, disons que c'est une convention :)
Et puis il n'y a pas de datas sensibles donc en GET c'est suffisant :)

Si tu penses que ton problème est réglé, penses à le passer en résolu stp ;)