2013-10-08 44 views
1

我有一個postLoad事件偵聽器,它執行查詢來檢索某些文件數據,該數據彈出到正在加載的實體的數組中。我這樣做是因爲我們有許多不同的項目需要添加到實體中,但不是實體必需的。現在它是文件,但我們最終將至少有7個這樣的「項目」。我們決定將它們作爲Symfony中的服務來實現,而不是將它們提供到infoArray中的「有效載荷」刪除。現在,當我們想添加一個新的「項目」時,我們不必編輯數十個業務對象來添加一個新的映射,我們可以將它添加到infoArrray(由服務名稱鍵入),任何需要它的人都可以從它該數組。ResultSetManager在postLoad事件處理程序後發生了破壞

所以我的實體看起來像

/** 
    * @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。

運行負荷後事件代碼後,我們把線480

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

跳回教義\ ORM \內部\水化\ ObjectHydrator此時私人varialble _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 

是否有可能在餐後事件被殺害ResultSetManager被用來滋潤對象時調用額外查詢加載?如果是這樣,有沒有辦法解決這個問題?我需要以不同的方式來解決這個問題嗎?

PS - 這個工程在另一個控制器中很好,在這個控制器中,唯一被水化的對象是父對象。它在對象被水合作爲對象圖的一部分的控制器中失敗。

回答

1

您可能正嘗試訪問postLoad事件中的關聯。

documentation

注意,任何 協會一直在初始化之前的餐後事件發生時一個實體。因此,在postLoad回調或事件處理程序中訪問 關聯是不安全的。

+0

這很有道理。我現在看到我正在訪問一個關聯,甚至認爲它是通過一個接口。它爲什麼會在一種情況下工作,而不是在另一種情況下工作?就像解析dql的方式以及實體在對象圖中的位置? – Quint

+0

其實我並沒有深入這個主題的內部,但我想起了一些類似的問題讓我瘋狂在過去:) – nifr

相關問題