Outils pour utilisateurs

Outils du site


symfony5:console_creer_ses_commandes

Créer ses propres commandes console

Créer des commandes console permettra, entre autres choses, d'appeler une fonction du site à intervalle régulier via une tâche cron.

Lister les commandes existantes

Les commandes perso sont préfixées du mot app:

php bin/console list app
...

Available commands for the "app" namespace:
  app:sendtestemail            Envoi d'un email pour test
  app:sendzippedfolder         Envoyer le contenu d'un dossier par email (zippé)
  app:test                     Commande console de test.

Exemple simple (affichage d'un texte)

/src/command/CommandeTest.php
namespace App\Command;
 
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
class CommandeTest extends Command {
 
    // Nom de la commande
    protected static $defaultName = 'app:test';
 
    protected function configure() {
 
        // Description
        $this->setDescription("Permet de faire un test dans la console");
 
        // Aide si on lance la commande "bin/console app:test -h"
        $this->setHelp("Aide de la commande...");
 
    }
 
    public function execute(
        InputInterface $input,
        OutputInterface $output
    ) {
 
        // Une ligne de texte
        $output->writeln("Bonjour !");
 
        // Plusieurs lignes de texte
        $output->writeln([
            "Première ligne",
            "Deuxième ligne"
        ]);
 
        return 0;
    }
 
}

L'autoconfiguration permet d'éviter d'avoir à recenser la nouvelle commande dans les services.

Lancer la commande :

php bin/console app:test

Commande avec arguments

/src/command/CommandeTest.php
namespace App\Command;
 
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 CommandeTest extends Command {
 
    // Nom de la commande
    protected static $defaultName = 'app:test';
 
    protected function configure() {
 
        $this->addArgument('username', InputArgument::REQUIRED, 'The username of the user.');
 
        // ...
    }
 
    public function execute(
        InputInterface $input,
        OutputInterface $output
    ) {
        $username = $input->getArgument('username');
 
        // ...
 
        $output->writeln("Nom d'utilisateur : " . $username);
 
        return 0;
    }
 
}

La valeur de l'argument doit être fournie sur la ligne de commande :

php bin/console app:test marc

Envoi d'un email

/src/command/SendTestEmail.php
namespace App\Command;
 
use \Swift_Mailer;
use \Swift_Message;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
class SendTestEmail extends Command {
 
    protected static $defaultName = 'app:sendtestemail';
 
    private $mailer;
 
    public function __construct(Swift_Mailer $mailer) {
        $this->mailer = $mailer;
        parent::__construct();
    }
 
    public function execute(
        InputInterface $input,
        OutputInterface $output
    ) {
        $message = new Swift_Message();
        $message->setFrom('bernard@example.com');
        $message->setTo('jeanine@example.com');
        $message->setSubject('Un petit test...');
        $message->setBody(
            "Salut, ceci est un petit test :-)",
            "text/plain"
        );
 
        if($this->mailer->send($message)) {
            $output->writeln("OK, le message a été envoyé.");
        } else {
            $output->writeln("Le message n'a pas été envoyé...");
        }
 
        return 0;
    }
 
}
symfony5/console_creer_ses_commandes.txt · Dernière modification: 2020/05/31 09:02 (modification externe)