Écrit par Alexandre Buleté

Mise à jour le 20 juillet 2019 | Difficulté : moyen

5.0/5   1 Avis  |  2.9K views

Routing

1. Les Basiques

Retournons maintenant à notre fichier web.php et analysons le plus en détail.


<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function() {
  return view('welcome');
});

On trouve une Class Route, d'où vient-elle ? En réalité il s'agit d'une façade du service provider RouteServiceProvider. Nous verrons de quoi il s'agit plus tard dans le cours.

Pour l'instant ce qui nous intéresse ici, c'est la méthode static get() qui contient comme paramètres :
1) Le slug Ici le paramètre 1 ‘/’indique qu’il s’agit de la page d’accueil.
2) Une fonction anonyme retournant view(‘welcome’)
Le paramètre 2 retourne notre vue « welcome » que nous avons vu plus tôt se trouvant dans resources/views/welcome.blade.php (pas besoin d’indiquer l'extension ‘.blade.php’ à la fin de ce paramètre).
Cette fonction view prend en dossier racine ‘resources/views’.

Donc si vous voulez retourner une vue se trouvant par exemple ici : "resources/views/pages/homepage.blade.php" Vous devez l’indiquer comme ceci : ‘pages/homepage’. Vous pouvez également l’écrire ‘pages.homepage’. Personnellement, j’utilise la deuxième façon (avec le point) car je la trouve plus lisible:


Route::get('/', function() {
    return view('pages.homepage');
});

Vous pouvez faire un rendu dynamique avec l'id d'une commande en mettant entre accolade le chemin qui sera généré dynamiquement et en passant la valeur souhaitée dans la fonction :


Route::get('/{id}', function($id) {
    return 'commande numéro : '.$id;
});

Donc si vous vous rendez sur la route /4750 par exemple vous obtiendrez le résultat suivant dans navigateur :
commande numéro : 4750

À savoir que vous pouvez bien entendu nommer différement la variable passer dans la fonction et celle des accolades. Laravel les associe dans l'ordre de déclaration. Par exemple dans le cas de plusieurs variables :


Route::get('/{date}/{name}', function($foo, $bar) {
    return 'commande de '.$bar.' passée le : '.$foo;
});

{date} correspond à $foo et {name} à $bar. Pour le chemin /05-04-1994/artichaut'' cela donnera : 
commande de artichaut passée le : 05-04-1994

2. Les méthodes utiles

Voici ce qu'il y a à savoir concernant les 2 paramètres à passer dans cette méthode get(), vous avez évidemment d'autres méthodes correspondant aux diverses requêtes possibles. Elles fonctionnent avec le même principe que la méthode get() que nous venons de voir, en voici la liste :

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Les formulaires HTML ne supportant pas les actions PUT, PATCH et DELETE vous devrez feinter en ajoutant un input caché avec le name "_method" dans vos formulaires ;)


<input type="hidden" name="_method" value="PUT">

Vous pouvez aussi autoriser plusieurs méthodes pour une même route avec les méthodes match() et any(). Avec match() vous devrez passer en premier paramètre un tableau avec les différentes méthodes autorisé et any(), comme son nom l'indique, autorise tout. Un exemple avec une route vers /login :


Route::match(['GET', 'POST', 'PUT'], 'login', function() {
    // code a exécuter
});

Route::any('login', function() {
    // code a exécuter
});

Des contraintes peuvent également être ajoutée en chainant la méthode where() notamment utilisée pour restreindre les routes avec des expressions régulières pour ne pas vous retrouver avec des url remplies de divers caractères :


Route::get('article/{title}', function ($title) {
    //
})->where(['title' => '[a-z]+']);

Si vous désirez appliquer une contrainte de manière globale vous devez l'ajouter dans la méthode boot() de votre RouteServiceProvider (situé dans app/Providers) :


/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');
    parent::boot();
}

Cela permettra d'appliquer cette contrainte à toutes les route contenant le paramètre dynamique nommé {id}.

3. Ordonner ses routes

Pour le moment vous n'avez pas beaucoup de route mais quand votre projet va commencer à grossir vous allez vous retrouver avec pléthore de routes ! Mieux vaut savoir dés maintenant quelques astuces pour les ranger correctement, en voici quelques unes :

Nommez vos routes !

 Grâce à la méthode name() que vous pouvez chaîner vous pouvez vous servir de votre route partout dans votre application simplement en utilisant le nom que vous définirez dans cette méthode. Cela permet d'avoir un code plus simple à maintenir et ne pas devoir changer la même route de partout !


Route::get('articles', function () {
    //
})->name('articles');

return redirect()->route('articles');
    

Lorsque vous nommez une route ayant des paramètres dynamiques vous devrez préciser les paramètres en question lorsque vous voudrez l'appeler :


Route::get('article/{id}/', function ($id) {
    //
})->name('article');

return redirect()->route('article', ['id' => 1]);

Vous pouvez également checker le nom de la route actuelle avec :


if ( \Request::route()->named('article') ) {
    //
}
    

Groupez vos routes !

Laravel vous propose diverses méthodes pour grouper vos routes. Je vous en présente 2 ici : prefix() et name() (d'autres existent mais elles font références à des notions que nous n'avons pas encore vu.)

prefix() vous permet de grouper vos routes ayant une page parent, par exemple grouper les routes enfants de /articles tel que /articles/1, articles/2 etc… :


Route::prefix('articles')->group(function () {
    Route::match('['get', 'post', 'put], {id}', function () { 
        // ici il s'agit des routes en get, post et put de /articles/{id}
    });
});

name() vous permet de grouper vos routes selon votre logique de nommage :


Route::name('articles.')->group(function () {
    Route::get('{id}', function () {
        //  il s'agit de la route nommée "articles.show"...
    })->name('show');
});

Voilà ! C'est tout pour le tour de piste sur le routing ! Nous avons vu comment définir nos routes et

Cool c’est bien sympa tout ça mais n'as-t-on pas vu dans le chapitre précédent que dans une structure MVC c’est le controller qui s’occupe de retourner des données à la vue ?

OUI ! Très bien vous suivez ! :p
En effet, dans une architecture MVC nous devrions faire passer cette fonction anonyme (en deuxième paramètre de la méthode) dans un controller. Et c’est ce que nous allons faire dans le chapitre suivant ! :)

Avis

N'hésitez pas à laisser votre avis. Actuellement 1 avis sur ce cours

Note Globale : 5.0/5

Classer par …  

Date

Rate

Dans l'ordre…  

Croissant

Décroissant

5.0/5

Merci beaucoup.

il y a 1 mois

notez et laissez un avis

--/5

connectez-vous pour laisser un avis

Vous n'avez pas de compte ? Inscrivez-vous ici.