[英]Zend Framework 2 - Rendering CSV data
我有一个模型,它返回带有 id、名称、价格等的汽车数据。所以我有一个汽车控制器和一个从模型中获取这些数据的 csv 操作:
$carTable = $this->getServiceLocator()->get('Application\Model\DbTable\Cars');
$cars = $carTable->fetchAll();
我需要将此“$cars”数据下载为 CSV 文件,以便用户可以将其存储在磁盘上。
我试图禁用布局并回显 CSV 字符串并设置“内容类型”和其他标题,但它没有立即可用。 然后我想我应该创建一个自定义的 CsvRenderer 并在配置中注册它。
由于我在 ZF2 站点或博客和 Stackoverflow 答案中找不到任何关于此的文档,我想知道这是否是在 ZF2 中将数据下载为 CSV 的推荐通用方法? 还是有我不知道的更简单的解决方案?
谢谢
一种解决方案是直接从控制器返回一个 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;
}
(请注意,我尚未测试此代码,但已根据注释进行了更新!)
既然我们在谈论 ZF2,我宁愿通过添加一个新的 CSV ViewStrategy/Renderer/ViewModel 来解决这个问题。
您可以在此处阅读有关实施自己的渲染和响应策略的更多信息: Zend Docs
甚至在这里:http: //zend-framework-community.634137.n4.nabble.com/ZF2-Implementing-custom-renderer-strategy-td4655896.html
这将使控制器中的代码更精简、更清晰、更清晰,因为您不必关心控制器中的标题,而是在渲染器中。 然后,每次您需要一个新的 CSV 输出时,您不必重新编写该操作,您只需使用 CSV 视图模型
这是基于 Rob 提供的答案。
在 Rob 的回答中,通过将$response->getHeaders()
分配给新的$headers
变量,然后将->addHeaderLine
应用于该新变量,它没有正确设置$response
上的标头。 因此,当返回时,标头未附加到响应中。
要解决此问题,只需将标头直接添加到$response
如下所示:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.