2013-06-29 29 views
12

我有這個方法在我的實體:更新前

/** 
    * @ORM\PreUpdate() 
    * @ORM\PrePersist() 
    */ 
    public function preStore() { 
     if ($this->getPictureFile()) { 
      $newFilename = sha1(mt_rand()); 
      $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension()); 
      $this->setPictureFilename($newFilename); 
     } 
    } 

和持續對象時一切正常,只是完美,但在更新的方法不觸發可言,我測試了這種方式:

/** 
    * @ORM\PreUpdate() 
    * @ORM\PrePersist() 
    */ 
    public function preStore() { var_dump('asdasdasdadsdasdas'); 
     if ($this->getPictureFile()) { 
      $newFilename = sha1(mt_rand()); 
      $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension()); 
      $this->setPictureFilename($newFilename); 
     } 
    } 

並在持久var_dump作品,但當我更新對象 - 它不。爲什麼?

回答

6

你必須明確地告訴學說認爲你的實體具有生命週期回調:

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YourClass 

進一步不需要後()在你的註釋,如果你不prvovide任何選項。

/** 
* @ORM\PrePersist 
* @ORM\PreUpdate 
*/ 
public function preStore() 

考慮使用監聽器/訂閱者而不是生命週期回調函數,以便更輕鬆地重用並保持實體更清潔。

更多信息可以在食譜章節How to Register Event Listeners and Subscribers中找到。

+2

如果我沒有@ORM \ HasLifeCycleCallbacks那麼prepersist也不會工作,正如我所說 - 它完美的工作。刪除尾部()並沒有改變任何東西。我知道我可以用事件監聽器來做,但我想知道它爲什麼不起作用? – user2394156

41

只有當實體字段(從教條中看過)發生變化時纔會發生更新,只有在更改後才調用preupdate方法。

注意:我猜你的圖片文件不是學說專欄等沒有遵守教條。所以你的實體不會因​​教義而改變。

How to handle File Uploads with Doctrine菜譜文章

如果在被持久化實體的領域之一發生變化時,更新前和PostUpdate回調纔會觸發。這意味着,默認情況下,如果只修改$ file屬性,則不會觸發這些事件,因爲屬性本​​身不是通過Doctrine直接持久化的。一種解決方案是使用持久化到Doctrine的更新字段,並在更改文件時手動修改它。

編輯:或者你使用的doctrine extensions

+0

嗯......所以如果我將doctrine列更改爲任何內容(例如「xxx」),那麼它應該繼續工作,因爲Doctrine映射的文件名被更改爲自動生成的文件名? – user2394156

+0

@PatrikKarishch·GRACIASSSSSSSSS(THANKSSSSSSSSSS)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! – ziiweb

0

另一個原因,這可能會失敗Uploadable behavior是,如果你只有一個星號

失敗: /* @ORM\PrePersist */

成功: /** @ORM\PrePersist */

可笑,但它是..

3

我碰到了同樣的問題,這是我的解決方案:

添加映射場updatedAt並調用setUpdatedAt(new \DateTime())UploadedFilesetter內,這將觸發preUpdate-Event爲實體

+0

@ Patrik的答案是一個很好的解決方案,它解釋了爲什麼這個方法可行 – Prof83