2012-07-30 6 views
81

私はsymfonyで構築されたフォームを編集するためにjQueryを使用しています。symfony2コントローラでjson応答を送信するにはどうすればいいですか

私はjQueryダイアログでフォームを表示してから送信しています。

データがデータベースに正しく入力されています。

しかし、JSONをjQueryに送り返す必要があるかどうかはわかりません。実際には私は少しJSON事と混同しています。

jQueryを使用してテーブルに行を追加し、フォームを送信した後にデータが送信された後、追加されたデータを表示するためにテーブル行を動的に追加できるように、

私はそのデータを取得することができますどのように混乱していますが、バック

これはこれは成功メッセージとちょうどテンプレートである私の現在のコード

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

ある

答えて

167

のSymfony 2.1

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

return $response; 

のSymfony 2.2と高い

あなたはJSONに配列をserialises特別JsonResponseクラス、持っている:

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

をしかし、あなたの問題は、エンティティをシリアル化する方法であるならば、あなたが持っている必要があります見てJMSSerializerBundle

あなたがインストールされていると仮定すると、simあなたはまた、StackOverflowの上で同様の問題があるかどうかを確認する必要があり

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

return new Response($serializedEntity); 

を行うにはプライ:

+1

を使用することができますし、JSONレスポンスとして送信しますか?私は1週間それを探しています.. http://stackoverflow.com/questions/14798532/symfony2-json-response-returns-weird-utf-characters –

+0

また、symfony JsonResponse(Symfony \ Component \ HttpFoundation \ JiddieResponse) – Kiddo

+0

@Kiddo - すでに回答のある文書へのリンクがあります; –

53

のSymfony 2.1はJsonResponseクラスがあります。

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

渡された配列はJSONエンコードされ、ステータスコードはデフォルトで200になり、コンテンツタイプはapplication/jsonに設定されます。

また、JSONPの便利なsetCallback関数もあります。

9

@thecatontheflatの回答を完了させるには、あなたの行動をtry ... catchブロック内にラップすることをお勧めします。これにより、JSONエンドポイントが例外を壊すのを防ぐことができます。ここで私は、スケルトン使用しています:

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

    } 
} 

この方法で、あなたのエンドポイントでもエラーが発生した場合には、一貫し動作します、あなたは右のクライアント側でそれらを扱うことができるようになります。

7

は、あなたのデータが既にシリアライズされた場合:データのニーズがあること場合

a)は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)のコールバックで(JSONP応答を送信)

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

を送信しますシリアル化された:

c)JSON応答を送信

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

D)()

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

e)のコールバックでJSONPレスポンスを送信するには、があなたのエンティティ内のグループを作成します

symfonyの3.xxの中でグループを使用

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

    // ... 
} 

Doctrineオブジェクトをアプリケーションのロジック内で正規化する

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

のSymfony 3.1ので、あなたは、どのように我々は、エンティティをシリアライズんJSONヘルパー 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()); 
} 
関連する問題