Aller au contenu principal
Version: 26.0.9.0

Créer une commande

Les commandes personnalisées permettent d'automatiser des tâches récurrentes,d'effectuer des opérations de maintenance ou d'interagir avec votre application depuis le terminal.

Création d'une commande

Pour créer une nouvelle commande, utilisez la commande suivante :

php dobby make:command MonNomDeCommande

Cette commande générera un nouveau fichier dans app/Commands/ avec la structure de base.

Structure de base d'une commande

Voici la structure complète d'une commande avec un exemple concret :

app/Commands/HelloWorldCommand.php
<?php

namespace App\Commands;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloWorldCommand extends Command
{
    protected static $defaultName = 'hello:world';

    public function __construct()
    {
        parent::__construct(self::$defaultName);
    }

    protected function configure()
    {
        $this
            ->setDescription('Dit bonjour à la personne')
            ->addArgument('name', InputArgument::REQUIRED, 'Prénom et nom')
            ->addArgument('age', InputArgument::OPTIONAL, 'Age')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $name = $input->getArgument('name');
        $age = $input->getArgument('age');

        if ($age) {
            $output->writeln("<info>Bonjour $name, vous avez $age ans</info>");
        } else {
            $output->writeln("<info>Bonjour $name</info>");
        }

        $output->writeln("<comment>Commande terminée</comment>");
        return Command::SUCCESS;
    }
}

Explication des parties importantes :

  1. $defaultName : Nom de la commande à utiliser dans le terminal
  2. __construct() : Initialise la commande avec son nom
  3. configure() : Configure la description et les arguments de la commande
  4. execute() : Contient la logique métier de la commande

Structure détaillée de la commande

Propriétés

PropriétéDescription
$defaultNameDéfinit le nom de la commande utilisé dans le terminal (ex: hello:world)

Méthodes principales

1. __construct()

Le constructeur initialise la commande avec son nom :

public function __construct()
{
    parent::__construct(self::$defaultName);
}

2. configure()

Définit la configuration de la commande :

  • Description
  • Arguments requis/optionnels
  • Options
  • Aide
protected function configure()
{
    $this
        ->setDescription('Dit bonjour à la personne')
        ->addArgument('name', InputArgument::REQUIRED, 'Prénom et nom')
        ->addArgument('age', InputArgument::OPTIONAL, 'Age')
    ;
}

3. execute()

Contient la logique métier de la commande :

protected function execute(InputInterface $input, OutputInterface $output): int
{
    // Récupération des arguments
    $name = $input->getArgument('name');
    $age = $input->getArgument('age');

    // Logique métier
    if ($age) {
        $output->writeln("<info>Bonjour $name, vous avez $age ans</info>");
    } else {
        $output->writeln("<info>Bonjour $name</info>");
    }

    // Message de fin
    $output->writeln("<comment>Commande terminée</comment>");

    // Code de retour : SUCCESS (0) ou FAILURE (1)
    return Command::SUCCESS;
}

Exemples pratiques

Commande avec confirmation

use Symfony\Component\Console\Question\ConfirmationQuestion;

// ...

protected function execute(InputInterface $input, OutputInterface $output): int
{
    $helper = $this->getHelper('question');
    $question = new ConfirmationQuestion('Voulez-vous continuer ? (y/N) ', false);

    if (!$helper->ask($input, $output, $question)) {
        return Command::SUCCESS;
    }

    // Suite du traitement...
}

Commande avec tableau de données

use Symfony\Component\Console\Helper\Table;

// ...

protected function execute(InputInterface $input, OutputInterface $output): int
{
    $table = new Table($output);
    $table
        ->setHeaders(['ID', 'Nom', 'Email'])
        ->setRows([
            [1, 'John Doe', 'john@example.com'],
            [2, 'Jane Smith', 'jane@example.com'],
        ]);
    $table->render();

    return Command::SUCCESS;
}

Bonnes pratiques

  1. Nommage : Utilisez un préfixe (ex: app:) pour vos commandes personnalisées
  2. Documentation : Documentez les arguments et options dans la méthode configure()
  3. Codes de retour : Utilisez les constantes Command::SUCCESS et Command::FAILURE

Exécution des commandes

Liste toutes les commandes disponibles :

php dobby help

Documentation complète

Pour plus d'informations, consultez la documentation officielle de Symfony Console.