如何在 PHP Symfony 4 中获取 POST 全局变量?

Posted

技术标签:

【中文标题】如何在 PHP Symfony 4 中获取 POST 全局变量?【英文标题】:How to get POST global variable in PHP Symfony 4? 【发布时间】:2019-07-20 05:46:42 【问题描述】:

我在 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 好的,在过去的某个地方遇到过类似的问题,但不太记得这里是否相关,所以我想我会把它放在锅里作为评论 【参考方案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

检查有用的链接:

http://php.net/manual/en/reserved.variables.post.php https://symfony.com/doc/current/introduction/http_fundamentals.html#symfony-request-object

【讨论】:

【参考方案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);。在此示例中,您将数据作为关联数组。

【讨论】:

以上是关于如何在 PHP Symfony 4 中获取 POST 全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

symfony 4:如何从 RootDir 获取“/public”

如何在 PHP docker 镜像上安装 yarn 和 npm(symfony 4 项目)

Symfony 4,从控制器获取 .env 参数,是不是可能以及如何?

如何强制为特定 PHP 版本创建新的 Symfony 应用程序?

如何在Symfony 4中为测试环境设置数据库

如何从 POS 打印机获取状态