2011-01-23 61 views
9

我正在學習doctrine2,並且如何自動調用構造函數時遇到問題。 例如,在我的實體我有

/** 
* @Entity 
*/ 
class User{ 
    .... 
    public function __construct() { 
     exit('in'); 
    } 
} 

,當我得到的對象是這樣的:

$userObj = $em->find('User', 1); 

我得到從數據庫對象,但是構造函數永遠不會被調用。 我想提出一些共同的東西在構造,如驗證規則,甚至把示例代碼學說文檔一樣

 $this->comments = new ArrayCollection(); 

,當我創建一個用戶喜歡

在代碼中創建新的對象這ofcourse工作
$user = new User(); //now constructor works just fine 

現在,獲取實體的「正確」方式是什麼?我懷疑我必須手動調用構造函數每次我用戶$ em-> find()與$ user0bj - > __構造(); ?這將有點吸吮然後......或者我應該使用其他的東西 - > find()來正確地獲得單個實體? 我知道我可以用戶@PrePersist,而我正在使用它來實際進行驗證檢查等。 我想我可能在這裏錯過了一些東西,或者我試圖以糟糕的方式使用構造函數。感謝您的任何解釋和指導!

+0

到目前爲止,我使用了在構造函數和@PostLoad事件中都調用的單獨的setUp()方法,它設置了當使用新的Obj()創建對象時需要在對象中設置的對象。並且它在從數據庫中提取obj時被調用。它可能會幫助有類似困境的人。 – Dalibor 2011-04-05 14:29:51

回答

6

我敢肯定,find或類似的預期不會調用構造函數...

您需要連接到@PostLoad事件。

+1

所以這就是我要把我的代碼放入構造函數的地方?我可以看到有一行說:「if($ this-> id){」,當我創建一個像「$ obj = new Obj」這樣的新對象時,這行會被調用嗎?或者我應該把它放在喚醒中:$ this - > __構造函數? – Dalibor 2011-01-24 07:39:49

+0

是的,如果從__wakeup方法調用構造函數,則會更好,這會節省重複代碼。 – Cobby 2011-01-24 22:50:51

2

你爲什麼要調用已經存在的實體的構造函數?當你需要驗證它時,你應該在你堅持它之前完成驗證或初始化。所以當你調用一個已經存在的實體時,沒有必要驗證它。 放置驗證和其他初始化的正確位置是實體的構造方法。例如,

/** 
* @Entity 
*/ 
class User{ 
    protected $name; 
    public function __construct($name) { 
     if (isset($name)) { 
      //** validate the name here */ 
      $this->name=$name; 
     } else { 
      throw new Exception("no user name set!"); 
     } 
    } 
} 

根據doctrine2文檔Doctrine2從來沒有調用實體的__construct()方法。 http://www.doctrine-project.org/docs/orm/2.0/en/reference/architecture.html?highlight=construct

相關問題