Ajax 调用 Symfony 控制器

Posted

技术标签:

【中文标题】Ajax 调用 Symfony 控制器【英文标题】:Ajax to call Symfony controller 【发布时间】:2021-10-05 17:08:57 【问题描述】:

我正在尝试使用 ajax 调用方法。 ajax连接成功,没有出现错误信息。

JS 代码

$("[id^=changeStatus]").each(function()
$(this).on("click", function()
  const id = $(this).data('id');
  console.log(id);
  $.ajax(
          type: "POST",
          url: "url('change_order_status')",
          data: id,
          async: false,
  )
  .done(function() 
    console.log('success');
  )
  .fail(function () 
    console.log('error');
  );
);

但控制器中的方法似乎不起作用。 控制器

/**
 * @Method("POST")
 * @Route("/%eccube_admin_route%/", name="change_order_status")
 * @param $request
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function changeOrderStatus(Request $request)

    if (!$request->isXmlHttpRequest()) 
        throw new BadRequestHttpException();
    
    
    $this->logger->info("it's working");
    dump($rquest);


我不知道它有什么问题。 请帮忙。

我将 js 插入到每个页面,因为 sn-p 这就是它无法正常工作的原因。

【问题讨论】:

你尝试过什么让它发挥作用?你被困在哪里了? 你能分享更多关于请求本身的细节吗?它是否发布到您希望使用的 URL 上?它是否包含应有的数据?您的网络标签告诉您有关请求的哪些信息? 【参考方案1】:

您必须在控制器中返回 Response 类的实例。所以在这里,你可以做的是返回一个 JsonResponse

return new JsonResponse($request->getContent());

【讨论】:

可以在你的开发工具中添加ajax响应的截图吗? 当然。我添加了控制台的屏幕截图。谢谢你问我。【参考方案2】:

也许你可以试试这个。

$("[id^=changeStatus]").each(function()
$(this).on("click", function()
  const id = $(this).data('id');
  console.log(id);
  $.ajax(
          type: "POST",
          url: " path('change_order_status') ",
          data: 
             id : id
          ,
          async: false,
  )
  .done(function(data) 
    console.log(data)
    console.log('success');
  )
  .fail(function () 
    console.log('error');
  );
);
/**
 * @Route("/%eccube_admin_route%/", name="change_order_status", methods="POST")
 * @param $request
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function changeOrderStatus(Request $request)

    if (!$request->isXmlHttpRequest()) 
        throw new BadRequestHttpException();
    
    
    $this->logger->info("it's working");

    $id = $request->request->get('id');

    // Try to dump your request
    // dd($request);
    
    return $this->json([
        'success' => true
    ]);

我只是不知道 eccube_admin_route 是什么意思。 并且不要忘记在控制器类中扩展 AbstractController

这是我项目中的示例。尝试转储您的控制器对象并使用 symfony 调试栏打开您的 ajax 请求,点击 url 列

【讨论】:

什么是“这个”?您能否为您的答案添加一些解释,以便其他人可以从中学习?你有什么改变,为什么? 非常感谢您的建议,但很抱歉它仍然不起作用。 “eccube_admin_route”是 EC 站点的配置页面。 Ajax 返回 eccube_admin_route 页面的 html 数据。不知道为什么不能调用该方法。 我将 js 插入到每个页面作为 sn-p 这就是为什么它不能正常工作? 我将“/%eccube_admin_route%/”更改为“/%eccube_admin_route%/order/ajax”,该函数看起来由 ajax 调用。谢谢你。但是,在$id = $request->query->get('id'); $id 会为空你能教我如何解决它吗? 你好,请尝试$id = $request->request->get('id');,我忘了你在ajax方法上使用post。

以上是关于Ajax 调用 Symfony 控制器的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2,检查一个动作是不是被ajax调用

Symfony2,检查一个动作是不是被ajax调用

Symfony2 - KnpPaginator - AJAX/嵌入式控制器

Symfony / Ajax:成功响应时调用函数

Symfony2 在 AJAX 调用中返回空 JSON,而变量不为空

Ajax 和 DefaultController Symfony