Php 从流式响应symfony返回json

Php 从流式响应symfony返回json,php,symfony,xmlhttprequest,symfony4,Php,Symfony,Xmlhttprequest,Symfony4,我的控制器中有一个流式响应功能,如下所示 /** * @Route("/manage/testajax", name="app_testajax") */ public function testAjax(Request $request) : Response { if (!$request->isXmlHttpRequest()) { throw new BadRequestHttpException('AJAX r

我的控制器中有一个流式响应功能,如下所示

/**
 * @Route("/manage/testajax", name="app_testajax")
 */
public function testAjax(Request $request)  : Response
{
    if (!$request->isXmlHttpRequest()) {
        throw new BadRequestHttpException('AJAX request expected.');
    }
 
    $response = new StreamedResponse();
    $response->setCallback(function () {
        $repeat = 4;
        for ($i = 1; $i < $repeat; ++$i) {
            echo 'Line '.$i;
            //new JsonResponse(['message' => $i, 'status' => 'success']);
            ob_flush();
            flush();
 
            if ($i < ($repeat - 1)) {
                sleep(2);
            }
        }
    });
 
    return $response;

}
/**
*@Route(“/manage/testajax”,name=“app_testajax”)
*/
公共函数testAjax(请求$Request):响应
{
如果(!$request->isXmlHttpRequest()){
抛出新的BadRequestHttpException(“应为AJAX请求”);
}
$response=新的流响应();
$response->setCallback(函数(){
$repeat=4;
对于($i=1;$i<$repeat;++$i){
回声“线”。$i;
//新的JsonResponse(['message'=>$i,'status'=>'success']);
ob_flush();
冲洗();
如果($i<($repeat-1)){
睡眠(2);
}
}
});
返回$response;
}
我的xml请求是

function startStreaming(lastResponseLength) {

                xhr = new XMLHttpRequest();
                xhr.open('GET', '{{ (path('app_testajax')) }}', true);
                xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
 
                xhr.onprogress = function(e) {
                                       console.log(e);

                    var response = e.currentTarget.response;
                    var output = lastResponseLength === false
                        ? response
                        : response.substring(lastResponseLength);
 
                    lastResponseLength = response.length;

                     console.log(output);

                };
 
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4) {
                      console.log("Completed");
                        //$('#stream-output').append('<p>Completed!</p>');
                    }
                };
 
                xhr.send();

            }
功能启动流程(lastResponseLength){
xhr=newXMLHttpRequest();
open('GET','{(path('app_testajax'))}}',true);
setRequestHeader('X-request-With','XMLHttpRequest');
xhr.onprogress=函数(e){
控制台日志(e);
var响应=e.currentTarget.response;
var输出=lastResponseLength==false
?响应
:response.substring(lastResponseLength);
lastResponseLength=响应长度;
控制台日志(输出);
};
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
控制台日志(“已完成”);
//$(“#流输出”).append(“已完成!

”); } }; xhr.send(); }
它将控制台输出作为

第1行第2行第3行已完成

但是我需要返回一个json。 像

新的JsonResponse(['message'=>$i,'status'=>'success'])


这是可能的。希望有人能帮你

你试过
echo json_encode(['message'=>$i])
?可能SSE会适合这种情况