Gorm veut, lui aussi, ajouter des plats en ligne de commande. Mais il ne se souvient jamais de l'ordre des arguments, ni du nom exact des catégories. Il voudrait taper app:plat:ajouter, tout court, et que la commande lui pose les questions.
Le mode interactif
Une commande tournée vers un humain peut demander ce qui lui manque :
#[Ask('…')], à côté d'un argument : la question est posée si l'argument manque ;- une méthode
#[Interact]: les questions qui demandent du code (une liste venue de la base) ; $io->choice(),$io->confirm(),$io->ask(): les questions deSymfonyStyle.
La même commande doit rester utilisable par un script. Avec --no-interaction (-n), aucune question n'est posée, et la valeur par défaut des confirmations s'applique.
Votre mission
Rendez app:plat:ajouter interactive :
- sans arguments, elle demande « Le nom du plat ? », « Son prix, en pièces d'or ? », puis « Dans quelle catégorie ? », à choisir dans la liste de la carte ;
- une réponse hors de la liste est refusée, et la question reposée ;
- avant d'écrire, elle demande « Ajouter « Tarte aux mûres » (4,50 po, Desserts) à la carte ? ». Si Gorm répond non : « Rien n'a été ajouté. », et rien n'est enregistré ;
- ce qui est déjà donné en argument ou en option n'est pas redemandé ;
- un prix qui n'est pas un nombre est refusé (« Le prix est un nombre… ») ; « 4,5 » avec une virgule est accepté.
Dans la console de l'aperçu
La console du navigateur tourne comme un script, sans personne pour répondre : elle ne pose jamais de questions. Essayez-y le mode non interactif, avec tous les arguments. Ce sont les tests qui répondent aux questions, avec CommandTester::setInputs(), exactement comme on teste une commande interactive dans un vrai projet.