1

クエリを実行して、読み込まれているエンティティの配列にポップされるファイル データを取得する postLoad イベント リスナーがあります。エンティティに追加する必要があるさまざまなアイテムが多数あるため、これを行っていますが、エンティティに不可欠ではありません。今はファイルですが、最終的にはこれらの「アイテム」が少なくとも 7 つになる予定です。個々の「アイテム」への 7 つの異なるマッピングを作成する代わりに、提供する「ペイロード」を infoArray にドロップする Symfony のサービスとしてそれらを実装することにしました。新しい「アイテム」を追加したい場合、新しいマッピングを追加するために何十ものビジネス オブジェクトを編集する必要はありません。それを infoArray (サービス名でキー) に追加するだけで、必要な人は誰でもそれを取得できます。その配列。

私のエンティティは次のようになります

/**
  * @var integer $id
  *
  * @ORM\Column(name="ID", type="integer", nullable=false)
  * @ORM\Id
  * @ORM\GeneratedValue(strategy="IDENTITY")
  * @Type("integer")
  * @SerGroups({"modulerevision", "module_revision"})
  */
  protected $id;
  .
  .
  .
  public $servicesArray;

イベントリスナーでは、次のメソッドを呼び出すことになります

 public function getFiles(ConsumerInterface $entity, $fullPath = false){
        $query = $this->em->createQuery(
            'SELECT f
             FROM FileManagerBundle:File f
             JOIN  f.owners o
             WHERE o.id = ?1');
        $query->setParameter(1, $entity->getOwner());
        $files = $query->getResult();
        return $files;      
    }

これはうまくいきます。クエリが実行され、ファイルの配列を取得し、それをエンティティの $infoArray にプッシュします。

postLoad イベント コードを実行した後、480 行目の Doctrine\ORM\Internal\Hydration\ObjectHydrator に戻ります。

 if ($this->_rsm->isMixed) {

この時点で、プライベート変数 _rsm は設定されなくなり、家は次の例外でクラッシュします。

Notice: Trying to get property of non-object in /var/www/symfony/xesapps/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php line 480 

postLoad イベント中に追加のクエリを呼び出すと、ロードされるオブジェクトをハイドレートするために使用されている ResultSetManager が強制終了される可能性はありますか? もしそうなら、これを回避する方法はありますか?これに別の方法でアプローチする必要がありますか?

PS - これは、ハイドレートされる唯一のオブジェクトが親オブジェクトである別のコントローラーでうまく機能します。オブジェクトがオブジェクト グラフの一部としてハイドレートされているコントローラーでは失敗します。

4

2 に答える 2

0

将来この質問を見つけた人へのメモです。回避策があります。きれいではありませんが、うまくいくようです。詳細については、http://www.doctrine-project.org/jira/browse/DDC-1010を参照してください。

そのチケットは、この問題を回避するドクトリン 2 の作業でコミットされたコードも指しています - https://github.com/doctrine/doctrine2/commit/8d13601e39d0fdefdd1d2c0a85704c440b8bdd37、うまくいけば、より良い解決策がすぐに来るでしょう。

于 2013-10-09T01:07:06.780 に答える