2016-06-11 3 views
4

symfony가 엔티티 객체로 배열을 반환하기 때문에 문제가 있습니다. json에 내 게시물 배열을 반환 할 수 없습니까? 내 코드symfony3가 쿼리에서 json으로 배열을 반환합니다.

그것 : 나는 $ this- 사용

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $posts = $em->getRepository('AppBundle:Post')->findAll(); 

    return $this->json($posts); 
} 

이> JSON이 반환 JSON 데이터이다는 기능은 SF3에 추가. 난 내 게시물을로드 할

[ 
    {}, 
    {}, 
    {} 
] 

: 하지만 내 결과입니다.

ps. 알아요, 나는 Query builder와 toArray 등의 메소드를 사용할 수 있습니다. 그러나 사용하고 DRY 할 방법은 무엇입니까?

use JsonSerializable; 

/** 
* @Entity 
*/ 
class SomeEntity implements JsonSerializable 
{ 
    /** @Column(length=50) */ 
    private $title; 

    /** @Column(length=50) */ 
    private $text; 

    public function jsonSerialize() 
    { 
     return array(
      'title' => $this->title, 
      'text' => $this->text, 
     ); 
    } 
} 

을 그리고 그것은 json_encode($someEntityInstance);만큼 간단합니다 엔티티가 여러 경계, 프록시 객체 및 관련 기관을 가질 수 있으므로 들으

답변

2

, 나는 개인적으로 명시 적으로 다음과 같이 직렬화하는 것입니다을 지정하는 것을 선호합니다.

작업을 완료하려면 JMSSerializerBundle을 사용할 수도 있습니다.

또한 데이터를 정규화하기 위해 직렬 변환기를 작성하는 옵션이 있습니다.

UPDATE :

당신은 JSON의 여러 표현을 원한다면, 그것은 다음과 같이 얻을 수있다 :

use JsonSerializable; 

/** 
* @Entity 
*/ 
class SomeEntity implements JsonSerializable 
{ 
    // ... 

    protected $isList; 

    public function toList() 
    { 
     $this->isList = TRUE; 

     return $this; 
    } 

    private function jsonSerializeToList() 
    { 
     return [ // array representing list... ] 
    } 

    public function jsonSerialize() 
    { 
     if($this->isList) { 
      $normalized = $this->jsonSerializeToList(); 
     } else { 
      $normalized = array(
       'title' => $this->title, 
       'text' => $this->text, 
      ); 
     } 

     return $normalized; 
    } 
} 

그리고 json_encode($someEntityInstance->toList());로했다. 어쨌든 이것은 좀 더러운 것이므로 인터페이스의 아이디어와 일관성을 유지하는 것이 좋습니다.

+0

은 jsonSerialize에 대해 2 개의 그룹을 만드는 옵션입니까? 예를 들어 내가 포스트가 : 한 jsonSerialize 목록 : ID, 제목, 내용, 태그 등 –

+0

음, 교리에 의해 반환 된 개체로 종류의 일치, 동일해야하지 않는 : 포스트 자세한 내용은 아이디, 제목과 하나 jsonSerialize을 당신은 사용자 정의 쿼리를 작성하고 정의합니다. 그러나이를 해킹 할 수있는 방법이 있습니다. 업데이트를 참조하십시오. – Nevertheless

2

가장 좋은 솔루션은 심포니의 시리얼 구성 요소를 활성화하는 것입니다 :

#app/config/config.yml 
framework: 
    serializer:  ~ 

참고 : 시리얼 라이저의 구성 요소가 기본적으로 사용되지 않습니다, 당신은/설정/config.yml 파일 응용 프로그램의 구성 행의 주석을 해제해야합니다.

+0

다음과 같은 오류 메시지가 나타납니다 : 순환 참조가 감지되었습니다 (구성된 제한 : 1). 포스트 엔티티가 차례로 엔티티 포스트를 의미 다른 엔티티와 관계를 가지고 있기 때문에 –

+0

은 아마 당신은 순환 참조 예외가 있습니다. 확인이 : http://symfony.com/doc/current/components/serializer.html#handling-circular-references – frieser

+0

네, 카테고리 관련 게시물을, 나는이 수행하는 방법을 잘 모릅니다 :/ –

관련 문제