2016-06-11 96 views
4

我有問題,我不能將我的posts數組返回給json becouse symfony返回數組和實體對象?Symfony3從查詢返回數組到json

它我的代碼:

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

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

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

我用$這個 - > JSON是返回JSON數據,功能加在SF3。 但這是我的結果:

[ 
    {}, 
    {}, 
    {} 
] 

我想加載我的文章。

ps。我知道,我可以使用查詢生成器,以及方法toArray或其他東西,但任何方法使用和DRY? THX

回答

2

由於實體可以有多個邊界,代理對象和相關的實體,我個人更喜歡明確規定什麼是即將被序列化,像這樣:

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);一樣簡單。

您也可以使用JMSSerializerBundle來完成DRY任務。

此外,還有一個選項可以編寫自己的序列化程序來規範化數據。

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

是否可以創建2組jsonSerialize?例如我有帖子: 一個jsonSerialize列表:標識,標題和一個jsonSerialize的帖子詳細信息: 編號,標題,內容,標籤等 –

+0

那麼,它應該是一致的,一樣的實體返回的原則,除非您編寫並定義自定義查詢。但是,有辦法破解它。查看更新。 – Nevertheless

2

一個最好的解決方案是使串行成分的Symfony:

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

注:串行組件默認是關閉的,你必須取消註釋在app /配置/ config.yml文件中的配置行。

+0

這給我錯誤:檢測到循環引用(配置的限制:1)。 –

+0

也許你有一個循環引用異常,因爲郵政實體與另一個實體有關係,郵政實體又轉而實體郵政。看看這個: http://symfony.com/doc/current/components/serializer.html#handling-circular-references – frieser

+0

是的,我有關係職位類別,我不知道如何做到這一點:/ –