问题描述
我的目标是向我的网页返回一条消息,在那里显示它,但不仅仅是消息,返回的值包含错误页面的消息和 html 代码!
这里是 Symfony 捆绑动作路由和函数定义:
/**
* @Route("/Utilities/getMessages/{callSign}/{loginDateTime}",* defaults={"callSign"="","loginDateTime"=""})
*
* @return: json string.
*
*/
public function getMessagesAction( $callSign,$loginDateTime ) { ... }
我正在使用以下代码将消息结果返回给 ajax 调用:
由 Ajax 调用调用的服务器端 PHP 代码......
$message = 'Some message to be displayed.';
// Return to the page and display the message ...
return new Response( $message ); // Inspecting $message shows only
// 'Some message to be displayed.'
调用上述代码并接收响应的客户端 JavaScript 代码:
$.ajax( { // Send form data to the same page that the page came from
type: 'POST',data: data,cache: false,async: true,contentType: false,enctype: 'multipart/form-data',processData: false
} )
.done( function( data,textStatus,jqXHR ) { ... } // Inspecting data
// shows more than
// 'Some ...
.fail( function( jqXHR,errorThrown ) { ... }
当断点设置在 return new Response( $message );
和 .done(...)
函数的第一个可执行行时,PHP 脚本执行到达 return new Response( $message );
语句处的断点,没有任何错误,我可以看到参数的值是“要显示的一些消息。”,正如预期的那样,但是当在 .done()
函数的第一行暂停时,数据参数的值是:
Some message to be 'displayed.<!DOCTYPE html><html>...</html>
!
如果将 html 代码放在文件中并加载到浏览器中,它看起来有点像这样:
Whoops,looks like something went wrong.
1/1 FatalErrorException in debug-eval(1) : eval()'d code line 1:
Parse Error: syntax error,unexpected ')'
in debug-eval(1) : eval()'d code line 1
一条明显的错误消息,但我的代码没有使用任何可能失败的 eval() 语句,并且执行到 Response 语句没有任何错误。这是 Symfony Response 语句方法/函数中的错误吗?如果没有,我怎样才能找出真正发生的事情,以便我可以解决它?
跟进
更改服务器端代码以对 json 字符串进行编码,然后在客户端对其进行解码无济于事。
服务器端 PHP 代码:
// Return to the login page and display the message ...
// $message'value => '{ "message":"' . $message . '"}';
$message = json_encode( [ 'message' => $message ] );
return new Response( $message );
客户端 Javascript:
***unchaged***
在这种情况下,我仍在检查数据参数,但它现在包含 json 编码的消息和 html 错误页面代码。将此提供给 JSON.parse( data );
语句以将 json 数据转换为 javaScript 对象会导致 javaScript 冻结。这不是 json 问题,附加到我的消息末尾的 html 代码问题仍然存在。
谢谢
解决方法
这不是一条非常明确的错误消息,但听起来您的错误来自 Xdebug,而不是 PHP。
您可以看到类似的问题 here。
我会在 PHPStorm 调试选项卡中检查您的“手表”选项卡,并且从 PHPStorm 转到 Run > View Breakpoints
并删除所有这些选项卡。为确保您也可以暂时停用 XDebug(通过 php.ini
设置)以确认问题消失。
尝试返回 new JsonResponse($json)
而不是 new Response($json)
。
如:
use Symfony\Component\HttpFoundation\JsonResponse;
// ...
return new JsonResponse(['message' => $message]);
如果您真的(我的意思是真的)无论出于何种原因想要返回响应,您也可以这样做:
$response = new Response(json_encode(['message' => $message]);
$response->headers->set('Content-Type','application/json');
return $response;
请记住,我从未尝试过最后一种选择,因为 JsonResponse 一直对我有用。此外,JsonResponse 扩展了 Response 类,因此如果您需要 Response 类中的任何内容,您可以在 JsonResponse 中获取。
由于此 Symfony Documentation,最后一个响应示例附加到此答案中。