我有一个模型可以返回带有ID,名称,价格等的汽车数据。所以我有一个汽车控制器和一个从模型中获取此数据的csv动作:
$carTable = $this->getServiceLocator()->get('Application\Model\DbTable\Cars');
$cars = $carTable->fetchAll();
我需要将此“$ cars”数据下载为CSV文件,以便用户将其存储在磁盘上。
我试图禁用布局并回显CSV字符串并设置“内容类型”和其他标题,但它没有开箱即用。然后我发现我应该创建一个自定义的CsvRenderer并在配置中注册它。
由于我在ZF2网站或博客和Stackoverflow答案中找不到关于此的任何文档,我想知道这是否是在ZF2中将数据下载为CSV的推荐通用方法?还是有一个我不知道的更简单的解决方案?
由于
答案 0 :(得分:11)
一种解决方案是直接从控制器返回Response对象。
这样的事情很有可能发挥作用:
public function downloadAction()
{
// magically create $content as a string containing CSV data
$response = $this->getResponse();
$headers = $response->getHeaders();
$headers->addHeaderLine('Content-Type', 'text/csv');
$headers->addHeaderLine('Content-Disposition', "attachment; filename=\"my_filen.csv\"");
$headers->addHeaderLine('Accept-Ranges', 'bytes');
$headers->addHeaderLine('Content-Length', strlen($content));
$response->setContent($content);
return $response;
}
(请注意,我尚未测试此代码,但已根据评论进行了更新!)
答案 1 :(得分:2)
有这个工作:
public function downloadAction()
{
// magically create $content as a string containing CSV data
$response = $this->getResponse();
$response->getHeaders()
->addHeaderLine('Content-Type', 'text/csv')
->addHeaderLine('Content-Disposition', "attachment; filename=\"my_filen.csv\"")
->addHeaderLine('Accept-Ranges', 'bytes')
->addHeaderLine('Content-Length', strlen($content));
$response->setContent($content);
return $response;
}
答案 2 :(得分:2)
由于我们讨论的是ZF2,我宁愿通过添加新的CSV ViewStrategy / Renderer / ViewModel来解决这个问题。
在这里,您可以阅读有关实施自己的渲染和响应策略的更多信息:Zend Docs
这将使控制器中的代码更加清晰,更清晰,更清晰,因为您不必关心控制器中的标题,而是关注渲染器中的标题。 然后,每次需要新的CSV输出时,您不必再次编写该操作,只需使用CSV视图模型