2013-05-22 5 views
0

SensioGeneratorBundle을 통해 생성 된 CRUD 양식은 described here입니다. 이것은 잘 작동합니다.Symfony2 컨트롤러에서 "Accept : application/json"을 기반으로 JSON을 반환합니다.

그러나 "Accept"HTTP 헤더에 "application/json"만 있으면 HTML 응답보다 JSON을 반환하고 싶습니다. JSON 서비스의 프로토 타입을 작성 중이므로 시작하는 데 도움이 될 것입니다.

use Symfony\Component\Serializer\Serializer; 
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; 
use Symfony\Component\Serializer\Encoder\JsonEncoder; 

$serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new 
JsonEncoder())); 
$json = $serializer->serialize($entity, 'json'); 

그러나, 그 말에, $의 JSON 내 JSON 데이터 인 문자열이 포함

는 나는이 같은 JSON 문자열로 내 엔티티를 켤 수 있다는 것을 알아 냈다. 그냥 일반적인 출력을 렌더링하는 대신 요청자에게 직접 출력하고 싶습니다. 새로운 JsonResponse ($ json)를 반환하려고 시도했지만 JSON 문자열을 다시 인코딩하므로 이중 인코딩이 적용됩니다.

  1. 는 HTTP requestion 헤더를 검사 할 수있는 "올바른"방법은 무엇입니까 :

    그래서 나는이 개 질문이? $ _SERVER를 살펴볼 수는 있지만 Symfony2에서 더 좋은 방법이 될 수 있다고 생각합니다.

  2. 일반적인보기를 렌더링하지 않고도 JSON 문자열을 반환하거나 요청을 직접 JSON으로 반환하는 "올바른"방법은 무엇입니까?

고마워요!

답변

0

이 현재 요청이 XHR 경우 확인하고 다시 올바른 형식의 JSON 데이터를 보낼 것입니다 : 그런데

public function someAction(Request $request) 
{ 
    if ($request->isXmlHttpRequest()) { 
     $serializer = new Serializer(array(
      new GetSetMethodNormalizer() 
     ), array(
      'json' => new JsonEncoder() 
     )); 

     $response = $serializer->serialize(array(
      'success' => true, 
      'data' => array(
       'entity' => $entities, 
      ) 
     ), 'json'); 

     return new Response($response, 200, array('Content-Type' => 'application/json')); 
    } else { 
     // Run "normal" request code, render a view 
    } 
} 

이 JMSSerializerBundle가 있기 때문에, 현실을 직시하자 (일련의 순차적 인 구문이 더 간단하게, 네이티브 심포니 이 방법은 추악하다.) 또한 주석을 통해 직렬화 할 엔티티 필드를 제외하는 것과 같은 추가 기능을 제공한다. JMS와

, 내 코드는 다음과 같습니다

if ($request->isXmlHttpRequest()) { 
    $response = array('success' => true, 'data' => array(
     'entity' => $this->container->get('serializer')->serialize($entity, 'json'), 
     'lastPage' => $lastPage, 
    )); 
    return new Response(json_encode($response), 200, array('Content-Type' => 'application/json')); 
} 

을 그리고 필요없이 길에 마지막으로 '성공'과 '데이터', 내가 읽을 수 상태 및 데이터를 분할하는 데 사용하는 단지 구조입니다 자바 스크립트에서.

+0

그게 좋습니다! 엔티티가 여전히 이중 인코딩되어 있었기 때문에 약간 수정해야했습니다. 여기에 내가 무엇을 생각해 냈어 : '$ serializer = new Serializer (array (new GetSetMethodNormalizer(), array ('json'=> new JsonEncoder())); ' '$ response = $ serializer-> serialize '$ result = new Response ($ response, 200, array ('Content()'); 배열 ('success'=> true, 'data'=> 배열 ('엔티티'=> $ 엔티티)), 'json' -Type '=>'application/json '));' – Josh

+0

그래, 주석에서 줄 바꿈을 얻는 방법을 알아낼 수 없다. 이전 코멘트에서 코드를 다시 포맷해야합니다 ... 죄송합니다. 또한 $ request-> getRequest()로 변경해야했습니다. – Josh

+0

죄송합니다. 코드에서 코드 조각을 가져 와서 약간 다른 인코딩을 사용하고 있습니다. 댓글 코드 태그 만 지원, 그 밖의 것은 없습니다.) $ 요청 해 드리겠습니다. 답변을 수정하겠습니다. –