将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' });