2 : Répondre aux incidents et aux demandes d'assistance et d'évolution

  • 1.2.1 Traiter des demandes concernant les services réseau et système, applicatifs

5 : Mise à disposition des utilisateurs d'un service informatique

  • 1.5.2 Déployer un service

Commande changePatternStructure

Cette commande permet de modifier la structure du fichier JSON afin d'y ajouter le support des langues fr et en pour internationaliser l'API.

php bin/console changePatternStructure

Elle ne prend aucun paramètre.


Commande text-to-speech

Cette commande génère les fichiers audio WAV à partir d'un fichier JSON.

php bin/console text-to-speech api genre langue fichier

Elle prend en paramètres :

  • L'API de text-to-speech externe à utiliser
  • Le genre de la voix : woman ou man
  • La langue : fr ou en
  • Le nom du fichier JSON

Améliorations apportées

  • Ajout d'une barre de progression pour visualiser l'avancement du traitement
  • Ajout d'un timer pour mesurer le temps d'exécution total
  • Ajout d'un bloc try/catch avec Throwable pour capturer toutes les erreurs et exceptions possibles, facilitant le débogage

Commande mergeCsv

php bin/console mergeCsv

Elle ne prend aucun paramètre.

Cette commande permet de fusionner un fichier CSV avec un fichier JSON. Elle est utilisée pour mettre à jour le fichier JSON contenant les prononciations, à partir d'un fichier CSV fourni par les développeurs de FileMaker — l'application utilisée pour créer les questions des séries de codes.

Code

#[AsCommand(
    name: "mergeCsv",
    description: "merge a csv file into pattern.json",
)]
class MergeCsvCommand extends Command
{
    public function __construct(
        private PatternService $patternService,
        private string $csvDirectoryPath,
    ) {
        parent::__construct();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        try {
            $data = $this->patternService->getJson();

            $csvFilePath = "{$this->csvDirectoryPath}/merge.csv";

            if (!file_exists(filename: $csvFilePath)) {
                $output->writeln("<error>Le fichier csv n'existe pas dans le répertoire src/resources/</error>");
                return Command::FAILURE;
            }

            $newData = $data;

            $file = fopen(filename: $csvFilePath, mode: "r");
            if ($file === false) {
                $output->writeln("<error>Impossible d'ouvrir le fichier CSV</error>");
                return Command::FAILURE;
            }

            while (($csv = fgetcsv(stream: $file)) !== false) {
                if (empty($csv[0]) || empty($csv[1])) {
                    $output->writeln("<error>erreur csv vide</error>");
                    continue;
                }
                if ($csv[0] === "word"){
                    continue;
                }
                $word = $csv[0];
                $pronunciation = $csv[1];
                if (array_key_exists(key: $word, array: $data)) {
                    $newData[$word]['fr']['exempleNomApi'] = $pronunciation;
                    $output->writeln("<info>Updated: $word </info>");
                    $this->patternService->writeJson($newData);
                } else {
                    $addWord = [
                        'word' => $word,
                        'lang' => "fr",
                        'api' => "exempleNomApi",
                        'pronunciation' => $csv[1],
                    ];
                    $this->patternService->addWord($addWord);

                    $output->writeln("<info>Add: {$word} </info>");
                }
            }
        } catch (\Throwable $e) {
            $output->writeln("<error>Une erreur est survenue : {$e->getMessage()}</error>");
            return Command::FAILURE;
        }

        return Command::SUCCESS;
    }
}

Fonctionnement

  • Récupération des données du fichier JSON via patternService->getJson()
  • Vérification de l'existence du fichier CSV dans le répertoire src/resources/
  • Lecture ligne par ligne du fichier CSV avec fgetcsv()
  • Pour chaque ligne :
    • Si le mot existe déjà dans le JSON → mise à jour de la prononciation de l'api externe pour la langue fr
    • Si le mot n'existe pas → ajout d'une nouvelle entrée pour la langue fr et l'api externe
  • Gestion des erreurs via un bloc try/catch avec Throwable