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会适合这种情况