我需要将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。因此,似乎数据正在发送,但控制器忽略了它。
答案 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')
应该这样做。