Conversion d'un fichier CSV en entités Symfony
Publié le 21/07/2024 • Actualisé le 21/07/2024
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