2016-05-06 4 views
0

Doctrine ORM Configurationの "DoctrineProxies"オブジェクトにユニバースが含まれているのはなぜですか?私はそうのような罰金のフィールドを持つエンティティを持っている私のORMコードで

//part of entity class Item: 
/** @Column(name="product_id", type="integer") */ 
private $productId; 

私は、このコードを実行:

//3 lines ~straight out of Doctrine configuration to get EntityManager 
include 'config/doctrine-config.php'; 
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode); 
$em = EntityManager::create($dbParams, $config); 

//my own code to retrieve an entity instance: 
$instance = $em->find(Item::class, 2); 
print_r($instance); 

をそして、これは私がいくつかの他の同様の特性をスキップ(取得出力されます)その上6(6個)の行があるか

Application\Entity\Item Object 
(
    [id:Application\Entity\Item:private] => 2 
    [description:Application\Entity\Item:private] => Product Kit 
    [productId:Application\Entity\Item:private] => -1 
) 

print_r()関数から出てきました。

、すべてが大丈夫だった、

次まで、私はそうのように、私のItem EntityクラスのManyToOne関係に$productId列を変更しました:

/** 
* @ManyToOne(targetEntity="Product", inversedBy="id") 
* @JoinColumn(name="product_id", referencedColumnName="id") 
*/ 
private $productId; 

私は同じコードを実行しました。

出典:2,392,600本の線は何ですか?

2百万三百二十六十六行行の出力がprint_rです。

何まさにこのオブジェクトであり、なぜそれがほとんど取るほど大きいです:私はDoctrineProxies\__CG__\Application\Entity\Productオブジェクトがprint_r

質問によって印刷さ2,392,564行が含まれていることがわかり、プリントアウトを見て

300Mbのディスク容量がプリントアウトされますか?

このような複雑さが毎日のコードでパフォーマンスの問題を引き起こしやすいのかどうか疑問に思っています。たとえば、私は毎日のコードに$instance変数の内容を表示していませんが、確かにを返します。メソッドコールからの膨大さ。つまり、上の$em->find(Item::class, 2);コールから渡された300Mbの変数ですか?

(非常に)部分的なリスト

Application\Entity\Item Object 
(
[id:Application\Entity\Item:private] => 2 
[description:Application\Entity\Item:private] => Product Kit 
[ProductId:Application\Entity\Item:private] => DoctrineProxies\__CG__\Application\Entity\Product Object 
    (
    [__initializer__] => Closure Object 
    (
    [static] => Array 
     (
     [entityPersister] => Doctrine\ORM\Persisters\Entity\BasicEntityPersister Object 
     (
     [class:protected] => Doctrine\ORM\Mapping\ClassMetadata Object 
      (
      [name] => Application\Entity\Product 
      [namespace] => Application\Entity 
      [rootEntityName] => Application\Entity\Product 
      [inheritanceType] => 1 
      [generatorType] => 5 
      [fieldMappings] => Array 
      (
      [id] => Array 
       (
       [fieldName] => id 
       [type] => integer 
       [scale] => 0 
       [length] => 
       [unique] => 
       [nullable] => 
       [precision] => 0 
       [columnName] => id 
       [id] => 1 
      ) 
      [fieldNames] => Array 
      (
      [id] => id 
      [description] => description 
      ) 

     [columnNames] => Array 
      (
      [id] => id 
      [description] => description 
      ) 

     [idGenerator] => Doctrine\ORM\Id\AssignedGenerator Object 
      [reflClass] => ReflectionClass Object 
      (
      [name] => Application\Entity\Product 
      ) 

     [namingStrategy:protected] => Doctrine\ORM\Mapping\DefaultNamingStrategy Object 
      [instantiator:Doctrine\ORM\Mapping\ClassMetadataInfo:private] => Doctrine\Instantiator\Instantiator Object 

     ) 

    [conn:protected] => Doctrine\DBAL\Connection Object 
      (
      [_conn:protected] => Doctrine\DBAL\Driver\PDOConnection Object 
      (
      ) 

     [_config:protected] => Doctrine\ORM\Configuration Object 
      (
      [_attributes:protected] => Array 
       (
       [metadataCacheImpl] => Doctrine\Common\Cache\ArrayCache Object 
       (
       [data:Doctrine\Common\Cache\ArrayCache:private] => Array 
        (
        [dc2_b1e855bc8c5c80316087e39e6c34bc26_[Application\Entity\Item$CLASSMETADATA][1]] => Array 
        (
        [0] => Doctrine\ORM\Mapping\ClassMetadata Object 
         (
         [name] => Application\Entity\Item 
         [namespace] => Application\Entity 
         [rootEntityName] => Application\Entity\Item 
         [customGeneratorDefinition] => 
         [customRepositoryClassName] => 
         [isMappedSuperclass] => 
         [isEmbeddedClass] => 
         [parentClasses] => Array 

    [BAZILLION LINES redacted for brevity] 

答えて

3

プロキシオブジェクトをXDebugや同様のツール(ダンプされたオブジェクトサイズを制限する)なしでダンプすることはできません。

問題は本当に、本当に簡単です:

プロキシ - >参照のEntityManager - >参照のUnitOfWork - >プロキシ

これは明らかに順番ににつながる再帰的なデータ構造のダンプ、につながる含まれていあなたが合理的な限界なしにそれをダンプしようとするときはいつも混乱します。

1

DoctrineProxies\__CG__\Application\Entity\Product プロキシクラスである...それが必要とされない限り、教義は、実際に(パフォーマンス用)データベースからエンティティをフェッチしていないことを意味しています(つまり、$product->getName()と呼んでください。これらのプロキシクラスは、お互いに再帰的なループであり、あなたが見たように非常に大きいです...あなたが深く潜んでいない限り、あなたが実際に必要としない情報の大部分は... print_r新しいsymfony 2.7+では、デバッグモードでdump()という関数があると思います...もしyエンティティを印刷するためにそれを使用してループプロテクションを行い、参照番号を表示します... \Doctrine\Common\Util\Debug::dump()を使用して、2^234234234行より小さなリストも出力します。

関連する問題