Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Laravel
  3. Organiser grâce aux contrôleurs
Extrait - Laravel Un framework efficace pour développer vos applications PHP (2e édition)
Extraits du livre
Laravel Un framework efficace pour développer vos applications PHP (2e édition) Revenir à la page d'achat du livre

Organiser grâce aux contrôleurs

Définition et usage

Dans le modèle MVC (modèle-vue-contrôleur), le contrôleur contient la logique concernant les actions effectuées par l’utilisateur. En pratique, dans une application Laravel, l’utilisation de contrôleurs permet de libérer les routes du code qu’elles contiennent dans leurs fonctions de rappel.

Un contrôleur est matérialisé par une classe et chacune de ses méthodes représente une action. Une action correspond généralement à une route.

1. Déplacer le code des fonctions de rappel des routes

Les routes créées dans les chapitres précédents sont surchargées de code pour traiter les actions dans leurs fonctions de rappel. L’objectif est de les libérer de ce code pour obtenir un fichier de routes propre qui fait simplement le lien entre les URI de l’application et les actions à effectuer pour chacun de ces URI.

Le fichier des routes routes/web.php est ainsi allégé, et devient un index des différents URI avec leurs actions associées.

Exemple de fichier de routes sans fonction de rappel

Route::get('videos', [VideoController::class, 'index']); 
 
Route::get('videos/creer', [VideoController::class, 'create']); 
 
Route::post('videos/creer', [VideoController::class, 'store']); ...

Créer et utiliser un contrôleur

1. Créer un contrôleur CRUD avec Artisan

Comme pour de nombreux autres éléments, Artisan, outil en ligne de commande fourni avec Laravel, permet de rapidement créer un fichier contenant la structure de base d’un contrôleur. Dans le cas où le contrôleur sera associé à un modèle de notre base de données, il est possible de le spécifier dès la création du contrôleur afin d’avoir les méthodes associées à la gestion du modèle en plus de la structure du contrôleur.

Créer un modèle puis son contrôleur associé

sail artisan make:model Product --migration 
 
sail artisan make:controller ProductController -model=Product  

Les contrôleurs sont créés dans le dossier app/Http/Controllers.

Par convention, les contrôleurs sont en notation Camel Case suffixé de « Controller ». Cela permet de les différencier des services et des modèles auxquels ils font référence.

Contrôleur généré via Artisan App\Http\Controllers\ProductController

<?php 
 
namespace App\Http\Controllers; 
 
use App\Models\Product; 
use Illuminate\Http\Request; 
 
class ProductController extends Controller 
{ 
 
    /** 
     * Display a listing of the resource. 
     */ 
    public function index() 
    { 
 
        // 
 
    } 
 
    /** 
     * Show the form for creating a new resource. 
     */ 
    public function create() 
    { 
 
        // 
 
    } 
 
    /** 
     * Store a newly created resource in storage. 
     */ 
    public function store(Request $request) 
    { 
 
        // ...

Injection de dépendances

1. Fonctionnement

Il est possible, grâce aux fonctions assistantes et au système de façades fourni par Laravel, d’accéder à de nombreux éléments dans les contrôleurs comme la requête de l’utilisateur, le cache, les sessions, etc.

Il est également possible d’injecter les dépendances directement dans les méthodes des contrôleurs, simplement en donnant l’indication d’un type connu par Laravel à un paramètre de la méthode représentant l’action.

Par exemple, pour récupérer une instance de la classe Illuminate\Http\Request, on peut passer à une méthode un premier paramètre $request préfixé par son type.

Affichage de l’URL dans une méthode de contrôleur

<?php 
 
namespace App\Http\Controllers; 
 
use Illuminate\Http\Request; 
 
class HomeController extends Controller 
{ 
 
    public function index(Request $request) 
    { 
 
        return 'URL de la page: ' . $request->url(); 
 
    } 
 
}  

La classe Illuminate\Http\Request et la fonction assistante pour y accéder seront étudiées dans la suite de ce chapitre et au chapitre Travailler avec les données, les sessions et le cache au chapitre Les sessions et le cache. En attendant, on retiendra simplement qu’on peut transmettre d’autres éléments du framework à une méthode du contrôleur.

2. Ordre des arguments

Comme indiqué précédemment, les paramètres des routes sont passés en arguments aux méthodes des contrôleurs.

Si une méthode d’un contrôleur attend à la fois un paramètre en provenance d’une route et utilise une dépendance (à la classe Illuminate\Http\Request par exemple), dans ce cas il faut d’abord indiquer à la méthode les dépendances et ensuite les paramètres de route.

L’exemple ci-dessous montre l’action qui met à jour un produit dans une base de données en fonction de son identifiant $product passé...

Bilan des premiers chapitres

Les contrôleurs permettent d’organiser l’application, de mieux séparer les responsabilités et donc de faciliter la création d’une base de code propre pour une application structurée. Une application bien organisée sera plus simple à maintenir et agréable à développer, pour les nouveaux venus comme pour les anciens.

Les routes, les vues, les modèles et les contrôleurs ont été étudiés dans cette première série de chapitres : le modèle MVC est donc à présent couvert dans son ensemble.

Développer une application Laravel revient dans un premier temps à jongler entre ces différentes notions : par exemple, on commence par créer un modèle, puis quelques routes qui permettront aux visiteurs d’utiliser ce modèle. On crée ensuite le contrôleur qui aura la charge de manipuler le modèle et de retourner les vues. Enfin, on crée les fichiers de vue et avec l’aide du moteur de template Blade, on affiche les données.

Et on répète ce processus chaque fois qu’il est nécessaire d’ajouter de nouvelles fonctionnalités.

Si le modèle évolue, peut-être faut-il également faire évoluer les vues pour afficher ses nouvelles données....