2012-07-30 5 views
81

Ich benutze jQuery, um mein Formular, das in Symfony eingebaut ist.Wie kann ich JSON Antwort in Symfony2-Controller senden

Ich zeige das Formular im jQuery-Dialog und sende es dann.

Daten werden korrekt in die Datenbank eingegeben.

Aber ich weiß nicht, ob ich einige JSON zurück zu jQuery senden muss. Eigentlich bin ich etwas verwirrt mit JSON-Sache.

Angenommen, ich habe eine Zeile in meiner Tabelle mit jQuery hinzugefügt, und wenn ich das Formular absende, möchte ich nach dem Senden der Daten diese Zeilendaten zurücksenden, damit ich die Tabellenzeile dynamisch hinzufügen kann.

Ich bin verwirrt, wie diese Daten wieder bekommen

Dies ist mein aktueller Code

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

Dies ist nur die Vorlage mit Erfolgsmeldung

Antwort

167

Symfony 2,1

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

return $response; 

Symfony 2.2 und höher

Sie haben spezielle JsonResponse-Klasse, die Array zu JSON serialisiert:

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

Aber wenn Ihr Problem ist, wie Unternehmen serialisiert dann sollten Sie ein Blick auf JMSSerializerBundle

Angenommen, Sie haben es installiert, werden Sie Sim haben zu tun lagig

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

return new Response($serializedEntity); 

Sie sollten auch prüfen für ähnliche Probleme auf Stackoverflow:

+1

So verwenden, wie wir Unternehmen serialisieren und als JSON Antwort senden? Ich habe seit einer Woche dafür gesucht. Http://Stackoverflow.com/questions/14798532/symfony2-json-response-returns-weird-utf-characters –

+0

Sie können auch Symfony JsonResponse (Symfony \ Component \ HttpFoundation \ JsonResponse) – Kiddo

+0

@Kiddo - es gibt bereits einen Link zum Dokument in der Antwort;) –

53

Symfony 2.1 eine JsonResponse Klasse.

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

Die in Array übergeben wird JSON der Statuscode codiert 200 und der Inhaltstyp ausfällt wird application/json eingestellt werden.

Es gibt auch eine handliche setCallback Funktion für JSONP.

9

Um @thecatontheflat Antwort zu vervollständigen, würde ich empfehlen, auch Ihre Aktion in einem try ... catch Block zu wickeln. Dies verhindert, dass Ihr JSON-Endpunkt bei Ausnahmen bricht.Hier ist das Skelett ich benutze:

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(), 
     ]); 

    } 
} 

Auf diese Weise Ihr Endpunkt verhalten wird konsequent auch bei einem Fehler, und Sie werden sie behandeln rechts auf einer Client-Seite können.

7

Wenn Ihre Daten bereits serialisiert:

a)

b) senden JSONP Antwort eine JSON-Antwort

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

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

Wenn Ihre Daten benötigt werden serialisiert:

c) eine JSON-Antwort senden

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

d) senden JSONP Antwort (mit Rückruf)

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

e) verwenden, um Gruppen in Symfony 3.xx

Gruppen erstellen in Ihrem Entities

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

    // ... 
} 

Normalisieren Sie Ihr Doctrine-Objekt innerhalb der Logik Ihrer Anwendung

<?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

Seit 3.1 Symfony können Sie JSON Helfer 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()); 
} 
Verwandte Themen