【发布时间】:2021-03-14 03:05:17
【问题描述】:
我的目标是向我的网页返回一条消息,并在其中显示它,但返回的值不仅包含消息,还包含错误页面的消息和 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, textStatus, 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 响应语句方法/函数中的错误吗?如果没有,我怎样才能找出真正发生的事情,以便修复它?
跟进
更改服务器端代码以对 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***
在这种情况下,我仍在检查 data 参数,但它现在包含 json 编码消息和 html 错误页面代码。将此提供给 JSON.parse( data ); 语句以将 json 数据转换为 javaScript 对象会导致 javaScript 冻结。这不是 json 问题,我的消息末尾附加的 html 代码的问题仍然存在。
谢谢
【问题讨论】:
-
这不是一个修复,而是一个变通方法,直到将响应传递回 .done 函数,问题才会显现出来,您必须在其中删除附加到消息或json字符串的结尾,然后正常处理消息值。太糟糕了,这必须在 JavaScript 的客户端完成。我的 PHP 脚本将 $message 变量设置为不同的值,它们中的大多数都可以在 JavaScript 中出现,除了少数包含 URL,并且在使用这些值之前必须删除额外的 HTML 代码。希望未来的 Symfony 能解决这个问题。
-
好像你有一个中间件正在尝试运行
eval()。在您的路由器中查找after功能。这可能会在从控制器返回Response对象和实际生成 HTTP 响应之间影响它。 -
Petr Hejda,您说的是接收 ajax 姿势的捆绑操作函数的路由,对吧?我更新了我的问题以显示路由。
-
我正在运行标准 Symfony,但不知道有任何中间件插件会干扰 json 返回字符串。
标签: javascript php ajax response symfony-2.8