02 - LARAVEL – ROUTAGE TP2
Gérer des routes plus complexes
1. Créer un nouveau projet Laravel « composer create-project laravel/laravel 02_routage »
2. Ouvrez-le dans Visual Studio Code
3. Par défaut, dans le fichier « [Link] », j’ai la route racine :
Route::get('/', function () {
return view('welcome');
});
4. Si on une application CRUD de gestion de livres par exemple, on aurai besoin d’avoir les routes suivantes :
• Afficher les livres
• Afficher le formulaire d’ajout
• Ajouter des livres (POST)
• Afficher le formulaire d’édition des livres
• Editer un livre (PUT / PATCH)
• Supprimer un livre (DELETE)
5. Alors pour afficher un livre « book » on aura besoin de créer un contrôleur « BookController » qu’on passera
au « Route » comme paramètre
6. Pour créer le contrôleur, on affiche le terminal et dans le dossier du projet « 02_routage » et on tape la
commande ARTISAN suivant :
Remarque : le drapeau « -r » permet juste de créer le contrôleur
7. Et si on développe le dossier « app/http/Controllers », on remarque que notre contrôleur a été créé avec
chacune des méthodes (index, create, store, show, edit, update et destroy)
8. On retourne dans le fichier « [Link] » et on crée un « Route » comme suit :
Route::resource('book', 'App\Http\Controllers\BookController');
9. On retourne dans la console et on affiche la liste des routes existants en tapant la commande ARTISAN
suivante :
10. On aura comme résultat affiché :
11. Pour expliquer c’est similaire à ceci :
Page 1 / 10
12. On peut chainer avec une fonction pour spécifier exactement les actions qu’on veut.
13. Par exemple, pour exclure l’action « destroy », on peut écrire :
Route::resource('book', 'App\Http\Controllers\BookController')->except(['destroy']);
14. Et si on retourne dans notre liste en tapant la commande ARTISAN « php artisan route:list », on verra que
toutes les actions ont été mappé sauf l’action « destroy ». Le résultat est le suivant :
15. De la même façon, on peut retirer aussi « edit » et « update ». La « Route » sera :
Route::resource('book', 'App\Http\Controllers\BookController')->except(['destroy',
'edit', 'update']);
16. Et le résultat de la liste sera :
17. L’inverse de la fonction « except » est « only » et ça s’écrit comme suit :
Route::resource('book', 'App\Http\Controllers\BookController')->only(['destroy', 'edit',
'update']);
18. Le résultat dans ce cas est le suivant :
Page 2 / 10
19. On peut aussi, au travers notre façade, gérer nos routes suivant les « Middlewares ». Pour cela, on va utiliser
la méthode « group » à laquelle je passe un tableau de middlewares. Le « Route » sera :
Route::group(['middleware' => ['auth', 'admin']], function(){
Route::resource('book', 'App\Http\Controllers\BookController');
});
20. En tapant la commande « php artisan route:list -v », le résultat sera :
21. On peut ajouter un niveau de profondeur. Par exemple dans le « Route principal » les routes définies sont
affecté par le middleware « auth » et à l’intérieur je définis un autre « Route » qui sera affecté par le
middleware « admin ». La « Route » sera comme suit :
Route::group(['middleware' => ['auth']], function(){
Route::resource('book', 'App\Http\Controllers\BookController');
Page 3 / 10
Route::group(['middleware' => ['admin']], function(){
Route::resource('admin', 'App\Http\Controllers\AdminController');
});
});
22. Le « Route » à l’intérieur sera affecté par les middlewares « admin » et « auth » car il est à l’intérieur de
l’autre.
23. Mais pour cela, on doit d’abord créer le contrôleur « AdminController » avec la commande artisan suivante :
24. En réaffichant la liste des « Routes », on aura comme résultat :
25. On voit que les routes de type « admin » qui ont le contrôleur « AdminController », il bénéficie des
middlewares « auth » et « admin » par contre le contrôleur « BookController », il bénéficie seulement du
middleware « auth »
26. Pour préciser les choses afin que ça ne rentre pas en conflit avec d’autres Routes, j’aurai besoin de préciser
un préfixe. Alors pour les URI « book », je vais préciser que ça soit « gestion/book ». Pour faire ça, on va
définir un préfixe après le middleware en modifiant le « Route » comme suit :
Route::group(
[
'middleware' => ['auth'],
'prefix' => 'gestion'
],
Page 4 / 10
function(){
Route::resource('book', 'App\Http\Controllers\BookController');
Route::group(['middleware' => ['admin']], function(){
Route::resource('admin', 'App\Http\Controllers\AdminController');
});
});
27. Si je reviens dans ma liste de « Routes », je vois que le préfixe a été mis en place.
28. Si je fais sortir le Route « admin » du Route « auth » je vais voir que le Route « admin » n’a plus le préfixe
« gestion »
Route::group(
[
'middleware' => ['auth'],
'prefix' => 'gestion'
],
function(){
Route::resource('book', 'App\Http\Controllers\BookController');
});
Route::group(['middleware' => ['admin']], function(){
Route::resource('admin', 'App\Http\Controllers\AdminController');
});
29. Résultat :
Page 5 / 10
30. On peut aussi avoir besoin d’organiser nos contrôleurs. Dans ce cas les « namespaces » changent et on doit
aussi changer le chemin de l’emplacement des contrôleurs dans les Routes. Par exemple, si on met le
contrôleur « BookController » dans un dossier comme suit :
31. On doit changer son « namespace » comme suit :
namespace App\Http\Controllers\Book;
32. Et puisque le contrôleur « BookController » hérite de « Controller » on doit ajouter la clause suivante pour le
reconnaitre :
use \App\Http\Controllers\Controller;
33. Et aussi modifier le Route qui l’utilise. La aussi, on a une méthode appelée « namespace » dans laquelle je
peux préciser le nom du dossier où se trouve le contrôleur.
Route::group(
[
'middleware' => ['auth'],
'prefix' => 'gestion',
'namespace' => 'Book'
],
function(){
Route::resource('book', '\App\Http\Controllers\Book\BookController');
});
Route::group(['middleware' => ['admin']], function(){
Route::resource('admin', '\App\Http\Controllers\AdminController');
});
Page 6 / 10
34. La liste des routes est toujours la suivante :
35. Pour plus d’organisation, je veux que le nom aussi par exemple « [Link] » soit génèré comme
« [Link] ». Pour cela, on a l’argument « as » pour qui on passe « gestion » comme suit :
Route::group(
[
'middleware' => ['auth'],
'prefix' => 'gestion',
'namespace' => 'Book',
'as' => 'gestion.'
],
function(){
Route::resource('book', '\App\Http\Controllers\Book\BookController');
});
Route::group(['middleware' => ['admin']], function(){
Route::resource('admin', '\App\Http\Controllers\AdminController');
});
36. Résultat :
Page 7 / 10
37. Pour bien gérer nos fichiers, dans le fichier « [Link] », on peut rajouter des Routes
directement dans ce dernier. Pour cela :
• On va dans le dossier « routes »
• On crée un dossier « book »
• Dans ce dernier, on crée un fichier « [Link] »
• On modifie ce dernier comme suit :
<?php
use Illuminate\Support\Facades\Route;
Route::group(
[
'middleware' => ['auth'],
'prefix' => 'gestion',
'namespace' => 'Book',
'as' => 'gestion.'
],
function(){
Route::resource('book', '\App\Http\Controllers\Book\BookController');
});
38. Et on modifie le fichier « [Link] » comme suit :
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
Page 8 / 10
/**
* The path to the "home" route for your application.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/[Link]'));
Route::middleware('web')
->group(base_path('routes/[Link]'));
Route::middleware('web')
->group(base_path('routes//book/[Link]'));
});
}
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}
39. On réaffiche la liste des Routes et tout s’affiche comme avant :
Page 9 / 10
Page 10 / 10