Contactez-nous

Créer un contrôleur et ses méthodes (actions) avec `make:controller`

Apprenez à utiliser la commande `make:controller` de Symfony MakerBundle pour générer rapidement des squelettes de contrôleurs et de méthodes (actions), accélérant ainsi votre développement.

Introduction à `make:controller` : votre assistant de création

Symfony, dans sa quête de productivité pour les développeurs, fournit un ensemble d'outils puissants regroupés au sein du MakerBundle. Parmi ces outils, la commande make:controller est spécifiquement conçue pour vous aider à générer rapidement le squelette d'un nouveau contrôleur et, optionnellement, ses premières méthodes (actions). Utiliser cette commande vous évite d'écrire manuellement le code répétitif de base, vous permettant de vous concentrer immédiatement sur la logique métier de votre application.

Lorsque vous démarrez une nouvelle fonctionnalité ou une nouvelle section de votre site web, la création d'un contrôleur est souvent l'une des premières étapes. make:controller simplifie ce processus en créant un fichier PHP correctement structuré dans le répertoire src/Controller/, avec l'espace de noms (namespace) approprié, l'héritage de AbstractController, et même une première route et méthode d'action si vous le souhaitez.

Ce chapitre vous montrera comment utiliser efficacement la commande make:controller, les options qu'elle propose, et comment le code généré constitue un excellent point de départ pour implémenter vos fonctionnalités. C'est un gain de temps appréciable, surtout pour les tâches récurrentes de création de contrôleurs.

Utilisation de la commande `make:controller`

Pour utiliser la commande make:controller, ouvrez votre terminal à la racine de votre projet Symfony et tapez la commande suivante :

php bin/console make:controller

Ou si vous utilisez le binaire Symfony :

symfony console make:controller

La console vous posera alors une question :

Choose a name for your controller class (e.g. AgreeableGnomeController):

Vous devez fournir le nom de la classe de votre contrôleur. Par convention, les noms de contrôleurs se terminent par le suffixe Controller. Par exemple, si vous voulez créer un contrôleur pour gérer des articles de blog, vous pourriez l'appeler BlogController. Si vous tapez simplement Blog, MakerBundle ajoutera automatiquement Controller pour vous.

Après avoir entré le nom, par exemple MonNouveauController, MakerBundle créera un nouveau fichier src/Controller/MonNouveauController.php et, par défaut, y ajoutera une méthode d'exemple nommée index(), associée à une route et à un template Twig basique.

Structure du contrôleur et de l'action générés

Supposons que vous ayez exécuté php bin/console make:controller ArticleController. Le MakerBundle générera un fichier src/Controller/ArticleController.php qui ressemblera à ceci :

render('article/index.html.twig', [
            'controller_name' => 'ArticleController',
        ]);
    }
}

Analysons ce code généré :

  • Namespace : App\Controller est l'espace de noms standard pour les contrôleurs.
  • Imports : Les classes AbstractController, Response, et Route sont importées car elles sont typiquement utilisées.
  • Héritage : La classe ArticleController étend AbstractController, donnant accès à des méthodes utilitaires (comme render(), redirectToRoute(), etc.).
  • Route et Action : Une méthode index() est créée, servant d'exemple. Elle est décorée avec l'attribut #[Route('/article', name: 'app_article')], ce qui signifie qu'elle sera exécutée lorsque l'URL /article sera accédée. Le nom de la route est app_article.
  • Réponse : La méthode index() retourne le résultat de $this->render(...). Cette méthode d'AbstractController est un raccourci pour rendre un template Twig. Ici, elle tente de rendre le template templates/article/index.html.twig (qui sera également créé par MakerBundle) en lui passant une variable controller_name.

MakerBundle créera également le template Twig correspondant, templates/article/index.html.twig, avec un contenu de base :

{% extends 'base.html.twig' %}

{% block title %}Hello ArticleController!{% endblock %}

{% block body %}


Hello {{ controller_name }}! ✅

This friendly message is coming from:
  • Your controller at <a href="{{ 'src/Controller/ArticleController.php'|file_link(0) }}">src/Controller/ArticleController.php</a>
  • Your template at <a href="{{ 'templates/article/index.html.twig'|file_link(0) }}">templates/article/index.html.twig</a>
{% endblock %}

Ce code généré vous offre un point de départ fonctionnel immédiat. Vous pouvez ensuite modifier la route, la logique de l'action index(), et le contenu du template Twig selon vos besoins, ou ajouter d'autres méthodes (actions) à ce contrôleur.

Ajouter d'autres méthodes (actions) à un contrôleur existant

Une fois votre contrôleur créé, vous ajouterez typiquement d'autres méthodes (actions) pour gérer différentes fonctionnalités liées à ce contrôleur. Par exemple, dans notre ArticleController, nous pourrions vouloir une action pour afficher un article spécifique, une autre pour créer un nouvel article, etc.

Vous pouvez ajouter ces méthodes manuellement en respectant la structure : une méthode publique, retournant un objet Response, et généralement décorée par un attribut #[Route].

Par exemple, pour ajouter une action show qui afficherait un article basé sur un id :

// Dans src/Controller/ArticleController.php

// ... (imports et début de la classe)

class ArticleController extends AbstractController
{
    #[Route('/article', name: 'app_article_index')]
    public function index(): Response
    {
        // ... (logique existante)
        return $this->render('article/index.html.twig', [
            'controller_name' => 'ArticleController',
        ]);
    }

    #[Route('/article/{id}', name: 'app_article_show', requirements: ['id' => '\d+'])]
    public function show(int $id): Response
    {
        // Logique pour récupérer et afficher l'article avec l'ID $id
        // Par exemple, récupérer depuis la base de données
        $article = ['id' => $id, 'title' => 'Titre de l\'article ' . $id, 'content' => 'Contenu...']; // Donnée factice

        if (!$article) { // Simule le cas où l'article n'est pas trouvé
            throw $this->createNotFoundException('L\'article avec l\'id ' . $id . ' n\'existe pas.');
        }

        return $this->render('article/show.html.twig', [
            'article' => $article,
        ]);
    }
}

N'oubliez pas de créer le template Twig correspondant (ici, templates/article/show.html.twig) si votre action rend une vue. Bien que la commande make:controller ne permette pas d'ajouter interactivement des méthodes à un contrôleur existant, elle est très utile pour le setup initial. Pour les ajouts ultérieurs, vous copierez et adapterez souvent une action existante ou écrirez la nouvelle action directement.

Utiliser make:controller est une excellente habitude à prendre pour démarrer rapidement et s'assurer que les conventions de base de Symfony sont respectées dès le début.