从控制器创建一个json响应

时间:2016-11-23 13:28:00

标签: javascript php ajax doctrine-orm symfony

我尝试在我的控制器中为我的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好或不好,我现在不知道。

5 个答案:

答案 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 debuggerladybug

等组件

答案 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;