Zend Framework 2 - 渲染CSV数据

时间:2012-12-03 16:39:14

标签: csv zend-framework2

我有一个模型可以返回带有ID,名称,价格等的汽车数据。所以我有一个汽车控制器和一个从模型中获取此数据的csv动作:

$carTable = $this->getServiceLocator()->get('Application\Model\DbTable\Cars');
$cars = $carTable->fetchAll();

我需要将此“$ cars”数据下载为CSV文件,以便用户将其存储在磁盘上。

我试图禁用布局并回显CSV字符串并设置“内容类型”和其他标题,但它没有开箱即用。然后我发现我应该创建一个自定义的CsvRenderer并在配置中注册它。

由于我在ZF2网站或博客和Stackoverflow答案中找不到关于此的任何文档,我想知道这是否是在ZF2中将数据下载为CSV的推荐通用方法?还是有一个我不知道的更简单的解决方案?

由于

3 个答案:

答案 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

甚至在这里:http://zend-framework-community.634137.n4.nabble.com/ZF2-Implementing-custom-renderer-strategy-td4655896.html

这将使控制器中的代码更加清晰,更清晰,更清晰,因为您不必关心控制器中的标题,而是关注渲染器中的标题。 然后,每次需要新的CSV输出时,您不必再次编写该操作,只需使用CSV视图模型