我尝试在我的控制器中为我的ajax请求创建一个JSON响应。目的是:用户可以编写和发布评论而无需刷新整个页面。但是在ajax请求之后,这个请求必须显示新的评论。
控制器
public function viewAction(Request $request, Article $article, $slug, $page)
{
$comment = new Comment();
$form = $this->get('form.factory')->create(CommentType::class, $comment);
if ($request->isXmlHttpRequest() && $form->handleRequest($request)->isValid()) {
if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
throw $this->createAccessDeniedException();
}
$user = $this->getUser();
$comment->setAuthor($user);
$em = $this->getDoctrine()->getManager();
$comment->setArticle($article);
$em->persist($comment);
$em->flush();
$nbComments = $this->getDoctrine()
->getManager()
->getRepository('PMPlatformBundle:Comment')
->getNbComments($article->getId())
;
return new JsonResponse(array('data' => array(
'nbComments' => $nbComments,
'newComment' => $comment
)));
}
在我看来,ajax
$("#form").submit(function(e) {
e.preventDefault();
var data = $(this).serialize();
$.ajax({
type: 'POST',
url: '{{ path('pm_platform_view', {slug: article.slug}) }}',
dataType: 'JSON',
data: data,
success: function(objResponse) {
$("#nbComments").html(objResponse.data.nbComments);
$("#newComment").append(objResponse.data.newComment); //or somthing like that
}
});
});
评论实体包含id,内容,作者(用户ID)和创建日期。
我的ajax请求工作正常,新注释在db中保留,但现在我必须在我的视图中显示新注释,所以我必须在控制器中创建一个好的json响应。但是响应存在问题。
在控制器中,我的JsonReponse是否有效?我的意思是我把查询结果直接放在数组中,如果对jsonReponse好或不好,我现在不知道。
答案 0 :(得分:1)
您可以使用如下所示的json_encode方法: -
json_encode([1, 2, 3]);
<强>编辑:强>
或者您可以使用以下代码: -
$items = array('nbComments' => $nbComments, 'newComments' => $newComments);
return new JsonResponse($items);
<强>被修改强>
成功之后,您可以使用当前代码: -
$("#nbComments").html(objResponse.data[0].nbComments);
$("#newComment").append(objResponse.data[1].newComments);
答案 1 :(得分:0)
如果我理解正确,您想在添加它的用户的当前网站中显示新添加的评论,对吧? 在这种情况下,最好在从服务器成功回调后给出容器的“附加”方法。
答案 2 :(得分:0)
显然,错误来自您的控制器,可能还有规范化过程。
您可以尝试转储$ newComments的结果,这可能是一个Doctrine ArrayCollection对象。
您可能没有将其转换为JsonResponse。
你有几个选择:
在将注释传递给JsonResponse之前,您可以尝试使用symfony normalizer来规范化我们的注释:
$out = $this->get('serializer')->normalize($newComments, 'json');
return new JsonResponse($out);
如果它不起作用,请尝试在返回之前转储数据。您可能希望使用symfony debugger或ladybug
等组件答案 3 :(得分:0)
尝试此功能
public function json($data){
$normalizers=array(new \Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer());
$encoders = array ("json"=>new \Symfony\Component\Serializer\Encoder\JsonEncoder());
$serializer = new \Symfony\Component\Serializer\Serializer($normalizers, $encoders);
$json = $serializer->serialize($data, 'json');
//Convierte la respuesta en un HTTP
$response = new \Symfony\Component\HttpFoundation\Response();
$response->setContent($json);
$response->headers->set("Content-Type", "application/json");
return $response;
}
这应该可以正常工作
答案 4 :(得分:0)
好的我用它来解决:
$data = array(
'nbComments' => $nbComments,
'comment' => $comment
);
$encoder = new JsonEncoder();
$normalizer = new ObjectNormalizer();
$normalizer->setIgnoredAttributes(array('article'));
$serializer = new Serializer(array($normalizer), array($encoder));
$dataJSON = $serializer->serialize($data, 'json');
$response = new Response();
$response->setContent($dataJSON);
$response->headers->set('Content-Type', 'application/json');
return $response;