Programmation PHP avec Symfony/Commande
Principe.
Les commandes sont, avec les contrôleurs, les seuls points d'entrée permettant de lancer le programme. Ce sont aussi des services mais elles se lancent via la console (en ).
La liste des commandes disponibles en console est visible avec :
 bin\console
 php bin\console
Parmi les principales commandes natives au framework et à ses bundles, on trouve :
Toutes les commandes peuvent être abrégées, par exemple "doctrine:migrations:generate" fonctionne avec "d:m:g" ou "do:mi:ge".
Créer une commande.
Lors du lancement d'une commande, on distingue deux types de paramètres :
Exemple :
 bin/console app:ma_commande argument1 --option1=test
class HelloWorldCommand extends Command
 protected function configure(): void
 $this
 ->addArgument(
 'argument1',
 InputArgument::OPTIONAL,
 'Argument de test'
 ->addOption(
 'option1',
 null,
 InputOption::VALUE_OPTIONAL,
 'Option de test'
 ;
 protected function execute(InputInterface $input, OutputInterface $output): int
 echo 'Hello World! '.$input->getOption('option1').' '.$input->getArgument('argument1');
 return self::SUCCESS;
NB : en SF < 6.1, remplacer l'attribut "AsCommand" par une propriété connue de la classe mère :
 protected static $defaultName = 'app:ma_commande';
Pour définir un argument tableau, utiliser codice_14 et séparer les valeurs par un espace. Ex :
 bin/console app:my_command arg1.1 arg1.2 arg1.3
Ajout de logs.
Pour que la commande logue ses actions, la documentation de Symfony propose deux solutions :
Cette deuxième option permet aussi d'afficher une barre de progression, ou d'interagir avec l'utilisateur :
 $io->confirm(Êtes vous sûr de vouloir faire ça ? (Yes/No)');
 $io->choice('Choisissez l\'option', ['première ligne', 'toutes les lignes'])
Ensuite il y a plusieurs niveaux de log pouvant colorer la console qui le permet :
 $io->info('Commentaire');
 $io->success('Succès');
 $io->warning('Warning');
 $io->error('Echec');
Toutefois ce n'est pas conforme à la PSR3 et si on veut utiliser ces logs comme ceux des autres services (pour les stocker ailleurs par exemple), mieux vaut utiliser codice_15 (en plus c'est horodaté).
Pour affichage les logs dans la console, utiliser le paramètre -v :
Tester une commande.
Ex :
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;
 * @see https://symfony.com/doc/current/console.html#testing-commands
class CommandTest extends KernelTestCase
 public function testExecute()
 $kernel = self::bootKernel();
 $monService = static::getContainer()->get('test.mon_service_public'); // En Symfony 6.3 on n'est plus obligé de créer un service public pour le test
 $application = new Application($kernel);
 $command = $application->find('app:ma_commande');
 $commandTester = new CommandTester($command);
 $commandTester->execute(
 '--option1' => 'option1',
 '--dry-run' => 'true',
 );
 $commandTester->assertCommandIsSuccessful();
 $output = $commandTester->getDisplay();
 $this->assertEmpty($output);

Programmation PHP avec Symfony/Contrôleur