Conversion d'un fichier CSV en entités Symfony

Publié le 21/07/2024 • Actualisé le 21/07/2024


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment convertir un fichier CSV en entités Symfony. Au lieu de définir chaque propriété manuellement, on peut utiliser le dénormaliseur Symfony, et nous pouvons utiliser un dénormaliseur personnalisé si des traitements spécifiques doivent être faits.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use App\Entity\Article;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet310Trait
{
    public function snippet310(): void
    {
        $csvFile = \dirname(__DIR__, 3).'/data/articles.csv';
        $file = new \SplFileObject($csvFile);
        $file->setFlags(\SplFileObject::READ_CSV);

        $idx = 0;
        $columns = [];

        foreach ($file as $fields) {
            // get properties' names
            if (++$idx === 1) {
                /** @var array<int|string> $columns */
                $columns = $fields;

                continue;
            }

            /** @var array<string, string> $fields */
            if (!(\count(array_filter($fields)) > 0)) { // ignore last empty line
                continue;
            }

            $entityArray = array_combine($columns, $fields);
            // prepare data before denormalization (this could be done in a custom denormalizer)
            $entityArray['active'] = (bool) $entityArray['active'];
            /** @var Article $entity */
            $entity = $this->serializer->denormalize($entityArray, Article::class);

            echo \sprintf('-- Entity %s n°%d', get_debug_type($entity), $idx).PHP_EOL;
            echo \sprintf('type: %s', $entity->getType()->value).PHP_EOL;
            echo \sprintf('active: %s', $entity->active() ? 'true' : 'false').PHP_EOL;
            echo \sprintf('name: %s', $entity->getName()).PHP_EOL;
            echo \sprintf('in language: %s', $entity->active()).PHP_EOL.PHP_EOL;
        }

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

  Travaillez avec moi !