将JSON对象发布到Symfony 2

我正在使用Symfony 2来开发一个项目,我已经构build了一个bundle来处理所有传递JSON数据的数据库服务。

我的问题/问题:

  • 是否可以直接向上发布JSON对象? 目前,我欺骗我的ajax调用通过给对象名称json={"key":"value"}如果我不给它一个名称,我似乎无法从数据Symfony请求对象$JSON = $request->request->get('json');

  • 我希望能够使用一个服务包来处理来自AJAX调用的数据或正常的Symfony表单。 目前我正在使用提交的Symfony表单,然后使用JSON_ENCODE获取数据,但是我不知道如何将数据发布到预期请求数据的服务控制器。

总结:

  • 我希望Symfony接受一个JSON发布对象而不是一个表单。

  • 我想通过请求/响应在控制器之间传递JSON对象

如果我对这一切都有错,请随时告诉我!

如果您想要在控制器中检索已在请求正文中作为标准JSON发送的数据,则可以执行与以下类似的操作:

 public function yourAction() { $params = array(); $content = $this->get("request")->getContent(); if (!empty($content)) { $params = json_decode($content, true); // 2nd param to get as array } } 

现在$params将是一个包含你的JSON数据的数组。 删除json_decode()调用中的true参数值以获取stdClass对象。

我写了一个方法来获取数组的内容

 protected function getContentAsArray(Request $request){ $content = $request->getContent(); if(empty($content)){ throw new BadRequestHttpException("Content is empty"); } if(!Validator::isValidJsonString($content)){ throw new BadRequestHttpException("Content is not a valid json"); } return new ArrayCollection(json_decode($content, true)); } 

我使用这个方法如下所示

 $content = $this->getContentAsArray($request); $category = new Category(); $category->setTitle($content->get('title')); $category->setMetaTitle($content->get('meta_title')); 

页面上的javascript:

 function submitPostForm(url, data) { var form = document.createElement("form"); form.action = url; form.method = 'POST'; form.style.display = 'none'; //if (typeof data === 'object') {} for (var attr in data) { var param = document.createElement("input"); param.name = attr; param.value = data[attr]; param.type = 'hidden'; form.appendChild(param); } document.body.appendChild(form); form.submit(); } 

在一些事件之后(比如点击“提交”):

 // products is now filled with a json array var products = jQuery('#spreadSheetWidget').spreadsheet('getProducts'); var postData = { 'action': action, 'products': products } submitPostForm(jQuery('#submitURLcreateorder').val(), postData); 

在控制器中:

  /** * @Route("/varelager/bestilling", name="_varelager_bestilling") * @Template() */ public function bestillingAction(Request $request) { $products = $request->request->get('products', null); // json-string $action = $request->request->get('action', null); return $this->render( 'VarelagerBundle:Varelager:bestilling.html.twig', array( 'postAction' => $action, 'products' => $products ) ); } 

在模板(bestilling.html.twig在我的情况):

  {% block resources %} {{ parent() }} <script type="text/javascript"> jQuery(function(){ //jQuery('#placeDateWidget').placedate(); {% autoescape false %} {% if products %} jQuery('#spreadSheetWidget').spreadsheet({ enable_listitem_amount: 1, products: {{products}} }); jQuery('#spreadSheetWidget').spreadsheet('sumQuantities'); {% endif %} {% endautoescape %} }); </script> {% endblock %} 

Alrite,我想这就是你想要的:)

编辑要发送一些东西,而不模拟表单,你可以使用jQuery.ajax()。 这里是一个与上面相同的例子,它不会触发页面刷新。

 jQuery.ajax({ url: jQuery('#submitURLsaveorder').val(), data: postData, success: function(returnedData, textStatus, jqXHR ){ jQuery('#spreadSheetWidget').spreadsheet('clear'); window.alert("Bestillingen ble lagret"); // consume returnedData here }, error: jQuery.varelager.ajaxError, // a method dataType: 'text', type: 'POST' });