2011-08-10 103 views
6

我使用Symfony 2與Doctrine 2爲iOS應用程序創建Web服務(JSON)。Symfony 2 Doctrine導出爲JSON

要取我的實體我做的:

$articles = $this->getDoctrine()->getRepository('UdoPaddujourBundle:MenuArticle')->findAll(); 

我必須告訴你的是:

$article = array(); 
$article = $articles->toArray(); 

使我有以下錯誤:

Fatal error: Call to a member function toArray() on a non-object 

同樣的事情

happends
$article = $articles->exportTo('json'); 

如何創建json響應?

親切的問候, Cearnau丹

編輯: 的var_dump($文章)=

array(18) { 
    [0]=> 
    object(Udo\PaddujourBundle\Entity\MenuArticle)#50 (4) { 
    ["id":"Udo\PaddujourBundle\Entity\MenuArticle":private]=> 
    int(1) 
    ["name":"Udo\PaddujourBundle\Entity\MenuArticle":private]=> 
    string(17) "My Article Name 1" 
    ["description":"Udo\PaddujourBundle\Entity\MenuArticle":private]=> 
    string(26) "My Article Description 1" 
    ["price":"Udo\PaddujourBundle\Entity\MenuArticle":private]=> 
    float(20) 
    } 
    [1]=> ... 

- 以後編輯

如何我可以通過所有的 「屬性名稱」 循環? 這就是我的了:

$myarray=array(); 
$myArray["name"]=array(); 
$myArray["description"]=array(); 
foreach($articles in $article) 
{ 
    array_push($myArray["name"], $article->getName()); 
    array_push($myArray["description"], $article->getDescription()); 
} 
+0

是什麼給了你'的var_dump($文章);'? – hakre

+0

陣列(18){ [0] => 對象(烏\ PaddujourBundle \實體\ MenuArticle)#50(4){ [ 「ID」: 「烏\ PaddujourBundle \實體\ MenuArticle」:私人] => int(1) [「name」:「Udo \ PaddujourBundle \ Entity \ MenuArticle」:private] => string(17)「My Article Name 1」 [「description」:「Udo \ PaddujourBundle \ Entity \ MenuArticle」 :私人] => 串(24), 「我的文章說明1」 [ 「價格」: 「烏\ PaddujourBundle \實體\ MenuArticle」:私人] => 浮子(20) } [1] => **等直到[17] ** –

+0

什麼給你'json_encode($ articles);'? – hakre

回答

3

如果你從symfony的1.x的背景的,有很多更「神奇」可用於實體,包括助手轉換爲數組等等。

在Symfony2中,大部分魔法都消失了;特別是實體現在是普通的舊的PHP對象,它們恰好由Doctrine 2來管理,以實現對數據庫的持久化,這意味着要在您的域對象上使用諸如toArray()等方法,您必須自己實現它們。這應該是相當簡單的 - 只需返回一個鍵值數組("name of property" => "value of property") ...如果您與其他實體建立了關係,則您還需要對這些方法實施toArray()方法,轉換時的主要實體。

然後,一旦你有你的對象數組,$json = json_encode($array);會給你一個JSON字符串發送作爲你的迴應。

+1

我該如何循環所有「屬性名稱「?最好的我的代碼是這個'$ myarray = array(); $ myArray的[ 「名稱」] =陣列(); $ myArray的[ 「描述」] =陣列(); foreach($ article中的$ article){array_push($ myArray [「name」],$ article-> getName()); array_push($ myArray [「description」],$ article-> getDescription()); }' –

14

如果使用學說查詢你也可以這樣做:

$em = $this->getDoctrine()->getEntityManager(); 
    $query = $em->createQuery('SELECT ma FROM UdoPaddujourBundle:MenuArticle ma ...etc'); 
    $myArray = $query->getArrayResult(); 

,然後json_encode($ myarray的);有關詳細信息,

+1

感謝它的工作原理,但與「GetRepository()」metod相比,它非常討厭。但如果這是得到json響應的唯一簡單方法,我必須處理它。 –

+1

您可以將該方法移動到自定義存儲庫,然後您不必看它;-) – codecowboy

+0

或者看看這個:http://stackoverflow.com/questions/6706485/how-to-encode- doctrine-entities-to-json-in-symfony-2-0-ajax-application – codecowboy

0

您可以使用json_encode($articles)當實體(或任何其它對象)實現JsonSerializablehere

<?php 

namespace My\AppBundle\Entity; 

use JsonSerializable; 

class Channel implements JsonSerializable 
{ 

    /* 
    * All your fields, getters and setters. 
    */ 

    /** 
    * Returns serializable items. 
    * 
    * @return array 
    */ 
    public function jsonSerialize() 
    { 
     return [ 
      'name' => $this->getName(), 
      'description' => $this->getDescription(), 
     ]; 
    } 
}