【问题标题】:Symfony v2.8 Response( $message ) method 'returning' more than expectedSymfony v2.8 响应($message)方法“返回”超出预期
【发布时间】: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


【解决方案1】:

这不是一个非常明确的错误消息,但听起来您的错误来自 Xdebug,而不是 PHP。

你可以看到类似的问题here

我会在 PHPStorm 调试选项卡中检查您的“Watches”选项卡,并从 PHPStorm 转到 Run > View Breakpoints 并删除所有这些选项卡。为确保您也可以暂时停用 XDebug(通过php.ini 设置)以确认问题消失。

【讨论】:

  • 谢谢 mickadoo,这对 eval 消息的来源很有意义,但对于为什么作为字符串接收的文本或 json 字符串首先导致错误并没有多大帮助.
  • 我的建议是您的 IDE 中的某些手表可能会导致错误,然后导致脚本停止并输出您看到的错误。
  • 再次感谢。我提供的赏金已过期,我找不到将它们转移给您的方法。如何兑现我的报价?
  • 不用担心 :-) 它帮助我找到了问题,而且很有趣。这是否意味着它通过删除手表/断点解决了您遇到的问题?如果您愿意,如果它解决了您的问题,您可以接受答案,然后对于将来有同样问题的人来说应该更清楚。
  • 您的回答似乎是问题的最可能原因,不幸的是,我无法实际测试它,因为我已经在调试器中更改了手表。太糟糕了,浏览器不允许您将手表保存在调试配置文件中,因此您可以在处理各种问题时轻松保存和恢复它们。无论如何,此时问题没有发生,虽然我稍微修改了代码,但我没有更改返回的 json 和非 json 字符串,只留下手表作为唯一真正的更改。再次感谢。
【解决方案2】:

尝试返回 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,最后一个响应示例附加到此答案。

【讨论】:

  • 谢谢 Rodolfo Rangel,是的,我确实在服务器端的其他 Ajax 成功返回中使用 JsonResponse,但在这种情况下,我希望能够发送文本字符串或 JSON 字符串,具体取决于Ajax 调用“想要”什么信息,即,如果需要简单的文本消息,则返回一个简单的文本字符串;如果表单更新了数据库,则返回一个 HTML 字符串;如果需要数据库中特定项目的数据,则返回一个包含多个相关数据值的 json 字符串。因此,我接受纯旧文本,并检查 json 周围的 {} 字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2020-02-08
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多