---
title: "Exporter des données avec Sonata Exporter"
date: 2024-10-10T09:24:44.000Z
canonical: https://www.ekino.fr/publications/exporter-des-donnees-avec-sonata-exporter/
---

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

![](https://www.ekino.fr/media/original/0000/00/794ed7ae-69c9-0608-d285-3b33f3c7e8e5.jpg)

Tout d’abord, sais-tu ce que sont les [itérateurs](https://www.php.net/manual/en/spl.iterators.php) ? Si ce n’est pas le cas, je t’invite à consulter mon [article](https://medium.com/ekino-france/comprendre-et-utiliser-les-it%C3%A9rateurs-en-php-22a864b3bfe2) à ce sujet. Cela te permettra de mieux comprendre le fonctionnement de [Sonata Exporter](https://github.com/sonata-project/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](https://github.com/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](https://github.com/sonata-project) ou [Symfony](https://symfony.com/doc/current/index.html).

#### 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](https://www.php.net/manual/en/class.iterator.php). Son rôle, comme son nom l’indique également, est de fournir les données à traiter.

Voici les [sources](https://github.com/sonata-project/exporter/tree/4.x/src/Source) déjà créées et proposées par [Sonata Exporter](https://github.com/sonata-project/exporter).

Pour plus de détails sur le fonctionnement des sources, n’hésite pas *à* *lire *[*mon article sur les itérateurs*](https://medium.com/ekino-france/comprendre-et-utiliser-les-it%C3%A9rateurs-en-php-22a864b3bfe2).

#### **Writer (output)**

Les Writers doivent impérativement implémenter l’interface [SonataExporterWriterWriterInterface](https://github.com/sonata-project/exporter/blob/4.x/src/Writer/WriterInterface.php). 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**](https://github.com/sonata-project/exporter/blob/4.x/src/Writer/WriterInterface.php)** :**

```
// 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](https://github.com/sonata-project/exporter/tree/4.x/src/Source) et [Writers](https://github.com/sonata-project/exporter/tree/4.x/src/Writer) 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](https://github.com/sonata-project/exporter/tree/4.x/src/Writer) 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](https://github.com/sonata-project/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](https://essential-dev-skills.com/poo/solid-single-responsibility)).

---

[Exporter des données avec Sonata Exporter](https://medium.com/ekino-france/exporter-des-donn%C3%A9es-avec-sonata-exporter-3a06f3394f26) was originally published in [ekino-france](https://medium.com/ekino-france) on Medium, where people are continuing the conversation by highlighting and responding to this story.
