====== 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;
}
}