Exporter un fichier CSV avec Symfony2

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Lorsque l'on travaille sur des applications de gestion, il est fréquent de devoir exporter des fichiers de données dans divers formats. Le plus simple des formats étant le CSV.

La plupart du temps, l'export passe par la génération d'un fichier temporaire qui est ensuite envoyé à l'utilisateur au travers d'un téléchargement de fichier via le navigateur. Pourtant Symfony2 fournit des outils permettant d'éviter de manipuler directement les fichiers temporaires via les StreamedResponse et les flux PHP.

La classe StreamedResponse permet de retourner un flux de réponse au client. Le contenu de la réponse est représenté par une fonction PHP au lieu d'une chaine de caractère :

public function generateCsvAction() {
    $repository = $this->get('app.repository.user');

    $response = new StreamedResponse();
    $response->setCallback(function() use ($repository) {
        $handle = fopen('php://output', 'w+');

        fputcsv($handle, ['Firstname', 'Lastname', 'Birthday'], ';');

        $results = $repository->findActiveUsers();
        foreach ($results as $user) {
            fputcsv(
                $handle,
                [$user->getFirstname(), $user->getLastname(), $user->getBirthday()],
                ';'
             );
        }

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'text/csv; charset=utf-8');
    $response->headers->set('Content-Disposition','attachment; filename="export-users.csv"');

    return $response;
}