2012-02-04 6 views
4

私はDoctrine2を使っています(Zend Framework内では、Symfony2はありません)。どのように(複雑な)教義2オブジェクトをシリアル化できますか?

2つの他のオブジェクトと1対多の関係を持つ「複雑な」doctrine2オブジェクトがあります。

私のオブジェクトの構造は、次のようになります。

$object->attribute1 = "foo"; 
    $object->attribute2 = "bar"; 
    $object->doctrineCollection1 = <DOCTRINE_COLLECTION2>; 
    $object->doctrineCollection1 = <DOCTRINE_COLLECTION2>; 

は私が何とかZendのキャッシュにそれを保存したいです。完全なオブジェクトを直列化する最良の方法は何ですか?また、ヒントを得るためにJSONにエンコードする方法を理解しようとしましたが、まだ成功していませんでした。

+3

あなたは 'serialize($ object);'を試したことがありますか? – RobinJ

+2

シンプルなシリアライズの下でCobbyが指摘しているように動作しません。残念ながら。 – herrjeh42

+0

@ jamie0726 [それは](http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/cookbook/implementing-wakeup-or-clone.html) – undefined

答えて

1

他人の意見とは異なり、あなたが必要としない多くの内部教義を連載するので、serialize()を使用するだけで動作しません。

IIRCでは、Doctrineエンティティを簡単にシリアル化する方法はありません。 EntityManagerを使用すると、プロパティをループオーバーして配列に取り出すクラスメタデータを取得できます。関連するエンティティを再帰的にネストして値を取得する必要があります。

I ソートofa library to help with serializing complex objects(ただし、決して終了しません)。そのプロジェクトで最小限のソースコードを掘り下げれば、値を引き出す方法を知ることができます。また、逆のことをするclassを見てみることもできます(しかし、関連するオブジェクトにネストしません)。

Doctrineのソースコードを掘り下げることを強くお勧めします。かなり教育的です。 API docsもご覧ください。特にDoctrine\ORM\Mapping\ClassMetadataInfoをご覧ください。

+0

私は正常にシリアル化していますDoctrine2オブジェクトをPHPでunserializeするだけです。オブジェクトのすべてのプロパティを直列化しないようにする '__sleep()'のドキュメントを読んでください。 –

0

私は同じ問題に直面しています。 Doctrineオブジェクトをシリアライズするためのより良い解決策を待っています。 Iアレイに教義オブジェクトを変換するコード[配列==> JSON]

<?php 
use Doctrine\ORM\PersistentCollection; 

class MyDoctrineEntity 
{ 
    public function arrayFy($level=1 ,array $ignore=array()){ 
     $maxLevel=3; 
     $dateFormat='Y-m-d H:i:s'; 
     if(is_array($level)){ 
      $ignore=$level; 
      $level=1; 
     } 
     $level=$level>$maxLevel?$maxLevel:$level; 
     $arr=array(); 
     foreach($this as $key=>$val){ 
      if(in_array($key ,$ignore)) 
       continue; 
      elseif(is_bool($val)|| is_int($val)||is_string($val)||is_null($val)|| is_float($val)) 
       $arr[$key]=$val; 
      elseif($val instanceof \DateTime) 
       $arr[$key]=$val->format($dateFormat); 

      elseif($val instanceof PersistentCollection && $level>0) 
      { 
       $childArr=array(); 
       if(count($val)) 
        foreach($val as $x) 
         $childArr[]=$x->arrayFy($level-1,$ignore); 

       $arr[$key]=$childArr; 
      }elseif($key!='_entityPersister'&&$key!='_identifier'&&$key!='__isInitialized__' && !($val instanceof PersistentCollection)) 

       $arr[$key]=$val->arrayFy($level-1,$ignore); 
     } 
     return $arr; 
    } 
} 

/** 
* @Entity 
* @Table(name="user") 
*/ 
class User extends MyDoctrineEntity 
{ 

を教義のエンティティを作成しながら、このクラスを拡張し、アレイ

$user->arrayFy(); // 
$user->arrayFy(2); // how deep you want to print ; default value : 1 , max value:3 
$user->arrayFy(array('created_by','salary')); // columns that you dont want to store 
$user->arrayFy(1,arra('created_by')); 
に教義を変換するために書かれています
+1

このタイプの機能を追加するためにクラスを拡張することは理想的ではありません。別のクラスから継承する必要があります。このクラスを外部クラスに任せるのが最善です。 – Cobby

0

コレクションのすべてのプロキシオブジェクトと関連するエンティティを初期化するだけです。その上でいくつかのメソッド(getIdを除く)を呼び出します。次に、あなたのオブジェクトをシリアル化してシリアル化することができます。例:

class Shop { 
    protected $owner; 
    protected $visitors; 
} 

// get shop from databse 
... 
// initialize proxy entitites 
$shop->getOwner()->getName(); 
$shop->getVisitors()->forAll(function($key, $visitor) { 
    $visitor->getName(); 
}) 

// then you can serialize; 
0

あなたがしようとしているのは、エンティティを「正規化」することです。あなたの配列を与える、そしてそこから、あなたの選択肢は無限です

use Symfony\Component\Serializer\Normalizer\PropertyNormalizer; 

$normalizer = new PropertyNormalizer(); 
$array  = $normalizer->normalize($entity); 

:あなたのコードで

"symfony/serializer" : "dev-master", 

:あなたのZF2プロジェクトの作曲で

幸運。 Alex

関連する問題