【问题标题】:How to get POST global variable in PHP Symfony 4?如何在 PHP Symfony 4 中获取 POST 全局变量?
【发布时间】:2026-01-16 12:00:01
【问题描述】:

我在 Symfony 4 中获取 POST 全局变量的结果时遇到了一个非常奇怪的问题。

我试过这样:

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

这就是我在日历输入的日期更改时实际发送 AJAX 请求的方式:

onSelect: function(date, instance) {
    $.ajax({
      url : 'home',
      type : 'POST',
      data : {'date':date},
      dataType : 'html',
      success : function(code_html, statut){
        console.log(statut);
      },

      error : function(resultat, statut, erreur){

      },

      complete : function(resultat, statut){

      }          
    });

onSelect 回调成功接收到我想要的日期值。

这个结果显示了 200 个成功代码,其中日期变量的值是正确的:

但是 $date 是null

【问题讨论】:

  • 抱歉,您有什么问题?你说哪一点不起作用?
  • var_dump($_POST) 会得到什么?鉴于您的分析器页面显示 POST var 在那里,但它也显示您正在发布到 /,这与 AJAX 请求正在做什么不同?您是否查看过浏览器工具的网络选项卡以了解实际发送到 home 的内容以及响应是什么?
  • data : {'date':date}, 更改为data : {date:date}, 我认为您的帖子密钥将不再是'date',它将变为date,您的代码将可以工作
  • @RiggsFolly 结果是一样的。它是双向的
  • @KubiRoazhon 好的,在过去的某个地方遇到过类似的问题,但不太记得这里是否相关,所以我想我会把它放在锅里作为评论

标签: php ajax symfony4


【解决方案1】:

您的代码中的标头或类似内容没有问题,并且 jQuery 请求是正确的(我测试了您的代码)。

问题可能出在您的 PHP 代码上,而您的问题中没有。

如果您正确地注入了Request 对象,您可以轻松地使用get() 来检索帖子变量。

例如:

namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class VeryDefaultController extends AbstractController
{

   /**
   * @Route("/very/default", name="very_default")
   * @param Request $request
   *
   * @return \Symfony\Component\HttpFoundation\Response
   */
   public function index(Request $request)
   { 
       $date = $request->get('date');
   }
}

在您的示例中,您正在执行 $request->request->get('date') 这对于 POSTPUT 请求来说很好,但它可能会失败,因为您没有正确注入 Request 对象。

上面的代码已经用你的 jQuery AJAX POST 请求进行了测试,它可以工作。那部分本质上没有错。并且完全可以使用get() 访问 POST 变量。

【讨论】:

  • 由于分析器显示了 post 变量和成功代码,我认为 PHP 部分是正确的。 POST 变量已发送,但我无法获取。
  • 发送POST变量,可以获取。只是你没有正确理解它。在您显示的唯一代码中,您执行$request->request->get(),这似乎没有多大意义。上面的代码经过测试,可以正常工作。
  • 没有有价值的解决方案,我还是有问题
  • 我不明白你的意思,@Taou。我应该在回答中更正什么?
  • @TaouBen Request::get() 适用于 GETPOST 参数。您所描述的是获取 request body;这不是这个问题试图做的。 (再次,我用他们特定的 AJAX 请求测试了代码)。
【解决方案2】:

您正在发送一个 JSON 字符串,因此您需要使用:

$content = $request->getContent();

然后你需要用json_decode解析它。

【讨论】:

    【解决方案3】:

    可能的解决方案是:

    $post_data = json_decode($request->getContent(), true);
    $date = $post_data['date'];
    

    【讨论】:

      【解决方案4】:

      您可能面临的问题与 PHP 用来将变量从帖子正文转换为 $_POST 的 Accept HTML 标头有关,而 Symfony 使用 $_POST 来填充请求对象数据。

      要获得此行为,您需要使用标头 application/x-www-form-urlencodedmultipart/form-data

      要检查是否确实如此,您需要使用代码:

      dump($request->getContent());
      

      如果它充满了变量,则意味着 PHP 没有将它们转换为 $_POST,因为 MIME 不匹配,如果不是,则意味着请求不正确。

      访问后变量的正常方法是:

      public function index(Request $request) 
      {
          dump($request->getContent()); // get raw body of http request 
          dump($request->request->get('date')); //get converted variable date by php and then by symfony
      }
      

      检查有用的链接:

      【讨论】:

        【解决方案5】:

        尝试添加内容类型,将您的 json 数据字符串化并使用传统的序列化,如下所示:

        onSelect: function(date, instance) {
        var data = {'date':date};
        $.ajax({
          url : 'home',
          type : 'POST',
          data : JSON.stringify(data),
          contentType: "application/json; charset=utf-8",
          traditional: true,
          dataType : 'html',
          success : function(code_html, statut){
            console.log(statut);
          },
        
          error : function(resultat, statut, erreur){
        
          },
        
          complete : function(resultat, statut){
        
          }          
        });
        

        由于您没有发布控制器代码,我建议您确保:

        • 您有一个类似\Symfony\Component\HttpFoundation\Request; 的使用语句
        • 你正在注入像public function post( Request $request )这样的请求
        • 您正在读取您的数据,例如$data = json_decode( $request->getContent(), true);。在此示例中,您将数据作为关联数组。

        【讨论】: