My code looks fine, I get status 200, I get the right headers, ... and yet my CSV file created will not donwload...
There is no error, so I do not understand why it's failing.
Here is my code:
namespace Rac\CaraBundle\Manager;
/* Imports */
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Validator\ValidatorInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpFoundation\StreamedResponse;
/* Local Imports */
use Rac\CaraBundle\Entity\Contact;
/**
* Class CSV Contact Importer
*/
class CSVContactImporterManager {
/**
* @var ObjectManager
*/
private $om;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var ValidatorInterface
*/
private $validator;
/**
* @var ContactManager
*/
private $contactManager;
/**
* @param EventDispatcherInterface $eventDispatcher
* @param ObjectManager $om
* @param Contact $contactManager
*
*/
public function __construct(
EventDispatcherInterface $eventDispatcher, ObjectManager $om, ValidatorInterface $validator, ContactManager $contactManager
) {
$this->eventDispatcher = $eventDispatcher;
$this->om = $om;
$this->validator = $validator;
$this->contactManager = $contactManager;
}
public function getExportToCSVResponse() {
// get the service container to pass to the closure
$contactList = $this->contactManager->findAll();
$response = new StreamedResponse();
$response->setCallback(
function () use ($contactList) {
//Import all contacts
$handle = fopen('php://output', 'r+');
// Add a row with the names of the columns for the CSV file
fputcsv($handle, array('Nom', 'Prénom', 'Société', 'Position', 'Email', 'Adresse', 'Téléphone', 'Téléphone mobile'), "\t");
$header = array();
//print_r($contactList);
foreach ($contactList as $row) {
fputcsv($handle, array(
$row->getFirstName(),
$row->getLastName(),
$row->getCompany(),
$row->getPosition(),
$row->getEmail(),
$row->getAddress(),
$row->getPhone(),
$row->getMobile(),
), "\t");
}
fclose($handle);
}
);
$response->headers->set('Content-Type', 'application/force-download');
$response->headers->set('Content-Disposition', 'attachment; filename="export.csv"');
return $response;
}
And my controller :
use Rac\CaraBundle\Entity\Contact;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use UCS\Bundle\RichUIBundle\Controller\BaseController;
use UCS\Bundle\RichUIBundle\Serializer\AbstractListSerializer;
/**
* Contact BackOffice Environment Controller.
*
*
*
* @Route("/contact_environment")
*/
class ContactEnvironmentController extends BaseController{
/* My code here..*/
/**
* @Route("/export", name="contact_environment_export",options={"expose"=true})
* @Method("GET")
*
* @return type
*/
public function exort(){
$manager = $this->get("cara.csv_contact_importer_manager");
return $manager->getExportToCSVResponse();
}
}
My response headers:
Cache-Control:no-cache, private
Connection:close
Content-Disposition:attachment; filename="export.csv"
Content-Type:application/force-download
Here is a Response based solution as requested by the author. In this design, the csv service merely returns the csv text. The Response is generated in the controller.
The csv generator:
The controller: