将json发送到symfony控制器

时间:2013-10-07 13:50:43

标签: php json jquery symfony

我需要将json数据传递给我的Symfony Controller。我的ajax函数看起来像这样:

var data = '{"firstname":"John"}';
$.ajax({  
type: "POST",  
url: save_url, //path to controller action  
data: {json:data},
success: function(response) {
     // Do something                
}
}); 

在我的控制器中,我尝试通过以下方式获取数据:

public function createAction(Request $request) {
    $data = $this->getRequest()->get('firstname');          
    return $this->render('MyBundle:Counter:test.html.twig', array(
        'data' => $data          
    )); 

为了看看这是否有效,我发送$ data以在模板中回显。在Firebug中,我可以看到正在发送的数据,一切似乎都有效,但是$ data是空的,没有任何回显。我在哪里做错了?

编辑:当我在Fireburg控制台中检查响应时,我会将数据放在那里,但它从未出现在模板中。 var_dump($ data)告诉$ data为null。因此,似乎数据正在发送,但控制器忽略了它。

4 个答案:

答案 0 :(得分:1)

正如马雷克注意到的那样:

$this->getRequest()

已经返回请求对象,您正在访问请求的request属性,该属性不会累加。试试:

$data = $this->request->get('json');

或使用:

$data = $this->getRequest()->get('json');

您当然可以将$this->getRequest()的返回值分配给变量,然后从那里调用该变量上的get方法...无论如何,这是我最初的答案,它确实包含一些您可能会觉得有用的提示和注意事项:

应该能够以这种方式获取数据,虽然AJAX请求+在模板中回显?这听起来有点奇怪。我没有看到您在任何地方将$data变量传递给$this->render来电。

这是我的一个项目中控制器操作的复制粘贴位。它在那里工作得很好:

public function indexAction()
{
    if (!$this->getRequest()->isXmlHttpRequest())
    {//check if request is AJAX request, if not redirect
        return $this->redirect(
            $this->generateUrl('foo_bar_homepage')//changed this, of course
        );
    }
    $id = $this->getRequest()->get('id',false);//works fine

但是,我无法理解你为什么要这样做:

 var data = '{"firstname":"John"}';

为什么不简单地去:

$.ajax({
    type: "POST",
    url: url,//post how you get this URL please...
    data: {firstname: 'John'},//jQ will sort this out for you
    success: function(response)
    {
        console.log(response);
    }
    error: function()
    {
        console.log('an error occured');
        console.log(arguments);//get debugging!
    }
});

然后,在您的控制器中,您可以:

$this->getRequest()->get('firstname');//it should be John

你甚至可以将{json:{firstname: 'john'}}作为数据参数传递给$.ajax,控制器的唯一区别就是你必须这样做:

$data = $this->getRequest()->get('json');
$firstName = $data['firstname'];

应该工作得很好,除非你有什么不告诉我们的事情:)

回顾:
这就是我写的:

public function createAction()
{//no Request param in controller
    if (!$this->getRequest()->isXmlHttpRequest())
    {//no ajax request, no play...
        $this->redirect(
            $this->generateUrl('homepage_route')
        );
    }
    $data = $this->getRequest()->get('firstname');
    //return json response:
    return new Response(json_encode(array('dataReceived' => $data));
    //return rendered HTML page:
    return $this->render('MyBundle:Counter:test.html.twig', array(
        'data' => $data          
    ));
}

当然,JS代码应该是:

$.ajax({  
    type: "POST",  
    url: 'route/to/create'
    data: {firstname:'John'},
    success: function(response)
    {
        console.log(response);
    }
});

我已经对此进行了测试,我看到没有理由为什么这不起作用。它对我来说很好......

答案 1 :(得分:1)

请注意这是@EliasVanOotegem原始示例,但有一些明显的步骤缺失

在控制器中我正在阅读一些回复,如“我无法看到它是如何工作的,因为我得到了空”这是因为你没有正确地键入你的对象。

var data = { name : 'john' };

$.ajax({
  type: "POST",
  url: url,//post how you get this URL please...
  data: {json : data},//jQ will sort this out for you
  success: function(response)
  {
      console.log(response);
  }
  error: function()
  {
    console.log('an error occured');
    console.log(arguments);//get debugging!
  }
});

您现在可以看到访问requerst对象,如

$request->get('json');

指的是json数据的post键

答案 2 :(得分:0)

内容是您要检索的内容,既不是参数也不是标题。

尝试:

$request->getContent();

答案 3 :(得分:0)

在你的情况下$request->request->get('json')应该这样做。