2012-07-30 13 views
81

Używam jQuery do edycji mojego formularza, który jest zbudowany w Symfony.Jak mogę wysłać odpowiedź json w kontrolerze symfony2

Wyświetlam formularz w oknie dialogowym jQuery, a następnie przesyłam go.

Dane wprowadzane są poprawnie w bazie danych.

Ale nie wiem, czy muszę wysłać JSON z powrotem do jQuery. Właściwie to jestem trochę zmieszany z JSON.

Załóżmy, że dodałem wiersz w mojej tabeli z jQuery i po przesłaniu formularza, po przesłaniu danych, chcę odesłać te dane wiersza, aby móc dynamicznie dodawać wiersz tabeli, aby pokazać dodane dane.

Jestem zdezorientowany jak można uzyskać te dane z powrotem

To jest mój aktualny kod

$editForm = $this->createForm(new StepsType(), $entity); 

$request = $this->getRequest(); 

$editForm->bindRequest($request); 

if ($editForm->isValid()) { 
    $em->persist($entity); 
    $em->flush(); 

    return $this->render('::success.html.twig');    
} 

To jest tylko szablon z komunikatem sukcesu

Odpowiedz

167

Symfony 2,1

$response = new Response(json_encode(array('name' => $name))); 
$response->headers->set('Content-Type', 'application/json'); 

return $response; 

Symfony 2.2 i wyższy

masz specjalne JsonResponse klasę, która serialises tablicę JSON:

return new JsonResponse(array('name' => $name)); 

Ale jeśli problem jest Jak serializacji podmiot wtedy powinieneś mieć spójrz na: JMSSerializerBundle

Zakładając, że masz go zainstalowany, będziesz miał sim ply zrobić

$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json'); 

return new Response($serializedEntity); 

Należy również sprawdzić, czy podobne problemy na StackOverflow:

+1

Jak więc Serializować jednostki i wysłać go jako JSON odpowiedzi? Szukałem tego przez tydzień .. http://stackoverflow.com/questions/14798532/symfony2-json-response-returns-weird-utf-characters –

+0

Możesz także użyć Symfony JsonResponse (Symfony \ Component \ HttpFoundation \ JsonResponse) – Kiddo

+0

@Kiddo - istnieje odnośnik do dokumentu już w odpowiedzi;) –

53

Symfony 2.1 posiada klasę JsonResponse.

return new JsonResponse(array('name' => $name)); 

Przekazany w tablicy będzie JSON zakodowany kod statusu będzie domyślnie 200 i typ zawartości zostanie ustawiony na application/json.

Istnieje również przydatna funkcja setCallback dla JSONP.

9

Aby ukończyć @thecatontheflat odpowiedź, chciałbym również zawinąć swoje działanie wewnątrz bloku try ... catch. Zapobiegnie to przełamaniu wyjątków przez punkt końcowy JSON.Oto szkielet używam:

public function someAction() 
{ 
    try { 

     // Your logic here... 

     return new JsonResponse([ 
      'success' => true, 
      'data' => [] // Your data here 
     ]); 

    } catch (\Exception $exception) { 

     return new JsonResponse([ 
      'success' => false, 
      'code' => $exception->getCode(), 
      'message' => $exception->getMessage(), 
     ]); 

    } 
} 

ten sposób Państwa końcowy będzie zachowywać się konsekwentnie, nawet w przypadku wystąpienia błędów i będzie można je traktować prawo na stronie klienta.

7

Jeśli dane są już w odcinkach:

a) wysłać odpowiedź JSON

public function someAction() 
{ 
    $response = new Response(); 
    $response->setContent(file_get_contents('path/to/file')); 
    $response->headers->set('Content-Type', 'application/json'); 
    return $response; 
} 

b) przesyła odpowiedź jsonp (z callback)

public function someAction() 
{ 
    $response = new Response(); 
    $response->setContent('/**/FUNCTION_CALLBACK_NAME(' . file_get_contents('path/to/file') . ');'); 
    $response->headers->set('Content-Type', 'text/javascript'); 
    return $response; 
} 

Jeśli Twoje potrzeby danych będzie numer seryjny:

c) wyślij odpowiedź JSON

public function someAction() 
{ 
    $response = new JsonResponse(); 
    $response->setData([some array]); 
    return $response; 
} 

d) wysłać odpowiedź jsonp (z zwrotnego)

public function someAction() 
{ 
    $response = new JsonResponse(); 
    $response->setData([some array]); 
    $response->setCallback('FUNCTION_CALLBACK_NAME'); 
    return $response; 
} 

e) korzystania z grup w Symfony 3.xx

Tworzenie grup wewnątrz swoich Podmiotów

<?php 

namespace Mindlahus; 

use Symfony\Component\Serializer\Annotation\Groups; 

/** 
* Some Super Class Name 
* 
* @ORM able("table_name") 
* @ORM\Entity(repositoryClass="SomeSuperClassNameRepository") 
* @UniqueEntity(
* fields={"foo", "boo"}, 
* ignoreNull=false 
*) 
*/ 
class SomeSuperClassName 
{ 
    /** 
    * @Groups({"group1", "group2"}) 
    */ 
    public $foo; 
    /** 
    * @Groups({"group1"}) 
    */ 
    public $date; 

    /** 
    * @Groups({"group3"}) 
    */ 
    public function getBar() // is* methods are also supported 
    { 
     return $this->bar; 
    } 

    // ... 
} 

Znormalizuj swój obiekt Doctrine w logice swojej aplikacji

<?php 

use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; 
// For annotations 
use Doctrine\Common\Annotations\AnnotationReader; 
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; 
use Symfony\Component\Serializer\Serializer; 
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; 
use Symfony\Component\Serializer\Encoder\JsonEncoder; 

... 

$repository = $this->getDoctrine()->getRepository('Mindlahus:SomeSuperClassName'); 
$SomeSuperObject = $repository->findOneById($id); 

$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); 
$encoder = new JsonEncoder(); 
$normalizer = new ObjectNormalizer($classMetadataFactory); 
$callback = function ($dateTime) { 
    return $dateTime instanceof \DateTime 
     ? $dateTime->format('m-d-Y') 
     : ''; 
}; 
$normalizer->setCallbacks(array('date' => $callback)); 
$serializer = new Serializer(array($normalizer), array($encoder)); 
$data = $serializer->normalize($SomeSuperObject, null, array('groups' => array('group1'))); 

$response = new Response(); 
$response->setContent($serializer->serialize($data, 'json')); 
$response->headers->set('Content-Type', 'application/json'); 
return $response; 
12

Od Symfony 3.1 można używać JSON Helper http://symfony.com/doc/current/book/controller.html#json-helper

public function indexAction() 
{ 
// returns '{"username":"jane.doe"}' and sets the proper Content-Type header 
return $this->json(array('username' => 'jane.doe')); 

// the shortcut defines three optional arguments 
// return $this->json($data, $status = 200, $headers = array(), $context = array()); 
} 
Powiązane problemy