我正在使用Symfony 2开发一个项目,我已经构建了一个bundle来处理我的所有数据库服务,它们会前后传递JSON数据。
我的问题/问题:
是否可以发布直接JSON对象?目前我通过给对象命名json={"key":"value"}
来欺骗我的ajax调用的正常表单帖子如果我不给它一个名字我似乎无法从Symfony请求对象{{1获取数据}}
我希望能够使用一个服务包来处理来自AJAX调用的数据或正常的Symfony表单。目前我正在提交提交的Symfony表单,然后使用JSON_ENCODE获取数据,我只是无法解决如何将数据发布到我期望请求数据的服务控制器。
总结:
我希望Symfony接受JSON帖子对象而不是表单。
我想使用Request / Response
如果我说这一切都错了,请随时告诉我!
答案 0 :(得分:132)
如果您想要在控制器中检索已在请求正文中作为标准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数据的数组。移除true
调用中的json_decode()
参数值以获取stdClass
对象。
答案 1 :(得分:9)
我编写了将内容作为数组
的方法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'));
答案 2 :(得分:1)
页面上的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'
});