====== 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**. * Doc officielle: [[https://symfony.com/doc/current/console.html]] * Exemple (ancienne version !) : [[https://www.babeuloula.fr/blog/creer-une-tache-cron-sous-symfony.html]] ===== 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) ===== 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 ===== 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 ===== 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; } }