首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2 StreamedResponse不允许我循环或设置变量

Symfony2 StreamedResponse不允许我循环或设置变量
EN

Stack Overflow用户
提问于 2016-02-23 23:50:27
回答 1查看 877关注 0票数 0

我正在尝试设置一个StreamedResponse,以便导出一个csv文件。但是,除了静态数组之外,我没有其他东西可以进入流中。

此功能不起作用

代码语言:javascript
复制
public function exampleCsvAction(Request $request)
{
    $tests = array(
        array('one', 'two', 'three'),
        array('one', 'two', 'three'),
        array('one', 'two', 'three')
    );

    $response = new StreamedResponse();
    $response->setCallback(function () {
        $handle = fopen('php://output', 'w+');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');

        // THIS LOOP BREAKS THE RESPONSE
        foreach ($tests as $test) {
            fputcsv($handle, $test, ',');
        }

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition', 'attachment; filename="example.csv"');
    return $response;
}

但是如果我去掉了前程循环,它就能工作了。

代码语言:javascript
复制
public function exampleCsvAction(Request $request)
{
    $tests = array(
        array('one', 'two', 'three'),
        array('one', 'two', 'three'),
        array('one', 'two', 'three')
    );

    $response = new StreamedResponse();
    $response->setCallback(function () {
        $handle = fopen('php://output', 'w+');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition', 'attachment; filename="example.csv"');
    return $response;
}

调用count()函数也会破坏它

代码语言:javascript
复制
public function exampleCsvAction(Request $request)
{
    $tests = array(
        array('one', 'two', 'three'),
        array('one', 'two', 'three'),
        array('one', 'two', 'three')
    );

    $response = new StreamedResponse();
    $response->setCallback(function () {
        $handle = fopen('php://output', 'w+');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');

        // THIS COUNT BREAKS THE RESPONSE
        $i = count($tests);

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition', 'attachment; filename="example.csv"');
    return $response;
}

编辑:

如果我尝试fputcsv其中一个$tests“行”,它也会中断。

代码语言:javascript
复制
public function exampleCsvAction(Request $request)
{
    $tests = array(
        array('one', 'two', 'three'),
        array('one', 'two', 'three'),
        array('one', 'two', 'three')
    );

    $response = new StreamedResponse();
    $response->setCallback(function () {
        $handle = fopen('php://output', 'w+');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');

        // THIS FPUTCSV BREAKS THE RESPONSE
        fputcsv($handle, $test[0], ',');

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition', 'attachment; filename="example.csv"');
    return $response;
}

但是,如果数组是内联的,我可以多次放置fputcsv。

代码语言:javascript
复制
public function exampleCsvAction(Request $request)
{
    $tests = array(
        array('one', 'two', 'three'),
        array('one', 'two', 'three'),
        array('one', 'two', 'three')
    );

    $response = new StreamedResponse();
    $response->setCallback(function () {
        $handle = fopen('php://output', 'w+');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition', 'attachment; filename="example.csv"');
    return $response;
}

在不工作的情况下,将铬重定向到我操作的路由,并显示一条"ERR_INVALID_RESPONSE“消息

我如何使用StreamedResponse来做一些有用的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-24 00:09:57

我在这里看到了我错过的地方,我忘记使用回调函数之外的变量()

代码语言:javascript
复制
public function exampleCsvAction(Request $request)
{
    $tests = array(
        array('one', 'two', 'three'),
        array('one', 'two', 'three'),
        array('one', 'two', 'three')
    );

    $response = new StreamedResponse();
    $response->setCallback(function () use(&$tests) {
        $handle = fopen('php://output', 'w+');
        fputcsv( $handle, array('ONE', 'TWO', 'THREE'), ',');

        foreach ($tests as $test) {
            fputcsv($handle, $test, ',');
        }

        fclose($handle);
    });

    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/force-download');
    $response->headers->set('Content-Disposition', 'attachment; filename="example.csv"');
    return $response;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35590613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档