2016-11-23 6 views
0

Я пытаюсь создать ответ JSON в моем контроллере для моего запроса ajax. Цель: Пользователь может писать и оставлять комментарии без обновления всей страницы. Но после запроса ajax этот запрос должен отображать новый комментарий.создать ответ json от контроллера

контроллер

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

Аякса на мой взгляд

$("#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 
     } 
    }); 
}); 

Комментарий объект содержит идентификатор, содержание, автор (идентификатор пользователя) и дату создания.

Мой запрос ajax отлично работает, новый комментарий сохраняется в db, но теперь я должен отображать новые комментарии в моем представлении, поэтому мне нужно создать хороший ответ json в контроллере. Однако есть проблема с ответом.

В контроллере действует ли мой JsonReponse? Я имею в виду, что я положил результат запроса непосредственно в массив, и я не сейчас, если это хорошо или нет для jsonReponse.

ответ

0

Ok исправить его:

$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; 
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); 
+0

Я думал JsonResponse кодировать непосредственно аргументы? См. Https://symfony.com/doc/current/components/http_foundation.html#creating-a-json-response –

+0

ok, пожалуйста, используйте этот JsonResponse ('data' => array ( 'nbComments' => $ nbComments, 'newComments' => $ newComments )) –

+0

Ошибка анализа: синтаксическая ошибка, неожиданная '=>' (T_DOUBLE_ARROW), ожидающая ',' или ')' ... –

0

Если я правильно понимаю, вы хотите, чтобы отобразить новый добавленный комментарий в текущем месте пользователя, который, верно? В этом случае лучше всего написать метод «добавить», который он дал контейнеру после успешного обратного вызова с сервера.

0

Видимо, ошибка исходит от вашего контроллера и, вероятно, процесс нормализации.

Вы можете попытаться сбросить результат $ newComments, который, вероятно, является объектом Doctrine ArrayCollection.

Возможно, вы не можете преобразовать его в JsonResponse.

У вас есть несколько вариантов там:

Вы можете попробовать использовать symfony normalizer нормализовать наши комментарии, прежде чем передать его JsonResponse:

$out = $this->get('serializer')->normalize($newComments, 'json'); 
return new JsonResponse($out); 

Если это не работает, попробуйте сбросить свои данные непосредственно перед Возврат.Вы можете использовать symfony debugger или компонент, как ladybug

+0

Я проверил документ отладки Symfony, объяснил мне, как используйте это, потому что документ не показывает, что .. Whit с помощью службы serializer. Я получил exeption. «Обнаружена круговая ссылка (сконфигурированный предел: 1)». ... –

+0

Лично я использую божью коровку и делаю 'ldd ($ newComments) '. Для круговой ссылки, я думаю, у вас есть сущность, ссылающаяся на другую сущность, которая ссылается на первую. Чтобы избежать этого, одним из решений является использование [аннотации групп] (https://symfony.com/doc/current/serializer.html#using-serialization-groups-annotations) –

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; 
} 

Это должно работать нормально

Смежные вопросы