3 Minutes read Tech 

Maîtrisez l’exportation de données avec Sonata Exporter

Tout d’abord, sais-tu ce que sont les itérateurs ? Si ce n’est pas le cas, je t’invite à consulter mon article à ce sujet. Cela te permettra de mieux comprendre le fonctionnement de Sonata Exporter, qui repose largement sur les itérateurs.

Qu’est-ce que c’est Sonata Exporter ?

Sonata Exporter est une bibliothèque de l’écosystème Sonata Project, conçue pour traiter efficacement des volumes massifs de données. Elle permet de manipuler de grandes quantités d’informations, quelle que soit leur source (fichiers CSV, XML, bases de données), tout en optimisant les performances et en évitant les problèmes de fuite de mémoire.

Un autre avantage de cette librairie est sa compatibilité avec tous les projets PHP, et pas seulement ceux basés sur Sonata Project ou Symfony.

Mais comment ça marche exactement ?

Le principe est simple : nous avons une Source (input) et un Writer (output) le tout géré par un Handler.

Source (input) :

Tout type de source doit implémenter l’interface Iterator. Son rôle, comme son nom l’indique également, est de fournir les données à traiter.

Voici les sources déjà créées et proposées par Sonata Exporter.

Pour plus de détails sur le fonctionnement des sources, n’hésite pas à lire mon article sur les itérateurs.

Writer (output)

Les Writers doivent impérativement implémenter l’interface SonataExporterWriterWriterInterface. Ils sont responsables de l’output du traitement, qui peut être : l’écriture d’un fichier, l’insertion ou la modification d’une ligne dans la base de données. Libre à vous, toute action est envisageable.

Regardons plus en détails les méthodes imposées par SonataExporterWriterWriterInterface :

// Cette méthode est appelée une fois, au commencement du traitement
public function open(): void
// Cette méthode est appelée à chaque tour de boucle. 
// L’argument $data contient les données de l’itération courante,
// sous format de tableau clé – valeur fournie par la Source.
public function write(array $data): void;
// Cette méthode est appelée une fois, à la fin du traitement
public function close(): void;

Maintenant que vous avez compris comment ça marche, voici un cas d’usage

Je dois générer un fichier .csv avec une liste des personnes. Le fichier .csv doit contenir leur prénom, nom et leur email.

Il est recommandé de commencer par explorer les Sources et Writers déjà disponibles dans la bibliothèque, afin de vérifier s’ils répondent à vos besoins. Cela permet d’éviter de réinventer la roue.

$people = [
[
'FirstName' => 'István',
'LastName' => 'Petőcs',
'Email' => 'istvan.petocs@email.com',
],
[
'FirstName' => 'Simon',
'LastName' => 'Sebestyén',
'Email' => 'simon.sebestyen@email.com',
],
[
'FirstName' => 'Norbert',
'LastName' => 'Barna',
'Email' => 'norbert.barna@email.com',
],
];

$handler = Handler::create(
new ArraySourceIterator($people),
new JsonWriter('/path/to/the/csv')
);

$handler->export();

Et voilà l’output :

FirstName;LastName;Email;
István;Petőcs;istvan.petocs@email.com;
Simon;Sebestyén;simon.sebestyen@email.com;
Norbert;Barna;norbert.barna@email.com

… c’est aussi simple que ça.

À présent, faisons l’inverse : nous disposons d’un fichier CSV contenant des informations sur des personnes, et nous souhaitons les insérer dans la base de données.

J’ai mon people.csv qui contient donc ma liste de personnes que je souhaite insérer :

FirstName;LastName;Email;
István;Petőcs;istvan.petocs@email.com;
Simon;Sebestyén;simon.sebestyen@email.com;
Norbert;Barna;norbert.barna@email.com

Ensuite, on vérifie si l’un des Writers proposés par la bibliothèque permet déjà d’effectuer l’insertion souhaitée. Comme ce n’est pas le cas, nous créons alors un Writer personnalisé.

use SonataExporterWriterWriterInterface;

class MyCustomWriter implements WriterInterface
{
public function open(): void
{
// Préparation de connexion à la base de données
...
}

/**
* @param array{
* "FirstName": string,
* "LastName": string,
* "Email": string
* } $data
*/
public function write(array $data): void
{
// Insertion dans la base de données
...
}

public function close(): void
{
// Fermeture de la connexion de la base de données
...
}
}

… et on procède à l’import :

use SonataExporterSourceCsvSourceIterator;

$handler = Handler::create(
new CsvSourceIterator('/path/to/the/csv'),
new MyCustomWriter(),
);

$handler->export();

…et voilà, données sont insérées dans la base de données. Facile.

En résumé, je vous recommande vivement d’utiliser Sonata Exporter pour les importations massives, le traitement de données ou la génération de fichiers. Cette bibliothèque assure une meilleure gestion de la mémoire tout en respectant le principe de responsabilité unique (Single Responsibility).


Exporter des données avec Sonata Exporter was originally published in ekino-france on Medium, where people are continuing the conversation by highlighting and responding to this story.