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

时间:2019-02-26 16:06:44

标签: php ajax symfony4

在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变量的值正确:

profiler screenshot

但是$ date是null

5 个答案:

答案 0 :(得分:7)

标头或代码中的类似内容没有问题,并且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
   *
   * @return \Symfony\Component\HttpFoundation\Response
   */
   public function index(Request $request)
   { 
       $date = $request->get('date');
   }
}

在您的示例中,您正在执行$request->request->get('date') 看起来不正确。但是由于您未显示要在何处创建$request,因此我们不确定。

上面的代码已通过您的jQuery AJAX POST请求进行了测试,并且有效。这部分没有天生的错误。而且完全可以使用get()访问POST变量。

答案 1 :(得分:0)

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

$content = $request->getContent();

,然后您需要使用json_decode对其进行解析。

干杯。

答案 2 :(得分:0)

您可能会遇到的问题与Accept HTML标头有关,PHP将PHP标头将变量从主体转换为$ _POST,而Symfony使用$ _POST填充请求对象数据。

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

要检查是否确实存在这种情况,您需要使用代码:

dump($request->getContent());

如果它充满变量,则表示由于MIME不匹配,PHP不会将它们转换为$ _POST;如果不是,则表示请求不正确。

访问post变量的常规方法是:

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
}

有用的链接来检查:

答案 3 :(得分:-1)

尝试添加内容类型,将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;这样的use语句
  • 您正在像public function post( Request $request )那样注入请求
  • 您正在读取$data = json_decode( $request->getContent(), true);之类的数据。在此示例中,您将数据作为assoc数组。

答案 4 :(得分:-1)

可能的解决方案:

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