2017-05-05 26 views
1

我已經有過這個問題幾次,我不知道最好/最乾淨的方式來處理它。我想在Symfony類/對象中創建一個createdAt(時間戳/日期時間)字段。我知道有幾種方法可以處理這個問題,但我想問問,是否有一種「最乾淨」的方式來實現它。最乾淨的方法來設置對象的時間戳/日期時間

選項1:創建構造(目前最喜歡的)

public function __construct() 
{ 
    $this->createdAt = new \DateTime(); 
} 

我喜歡這個最大,因爲它是明確的,它是「建設」過程中設置。

一個連接的問題是,如果我通過一個存儲庫從數據庫中獲取一個實體,那麼這個構造函數是否會被調用(即調用new \DateTime()後直接被數據庫值覆蓋)?

選項2:類

class MyClass { 

    protected $createdAt = new \DateTime(); 

    /** ... */ 
} 

這是好的默認值,我想?

方案3:生命週期回調

/** 
* @PrePersist 
*/ 
public function onPrePersistCreated() 
{ 
    $this->createdAt = new \DateTime(); 
} 

我覺得有點unelegant,因爲它有點的副作用,但也許是好的。另一個缺點是,我不得不等待它堅持到我的數據庫獲得createdAt

類似的將使用DoctrineExtensions'Timestampable

方案4:在數據庫

在Symfony的類學說註釋您可以$createdAt設置默認值默認值,但我覺得這有點不穩定。像

/** 
* @var \DateTime 
* @ORM\Column(name="created_at", type="datetime", options={"default" : "CURRENT_TIMESTAMP"}) 
*/ 

東西(沒有測試代碼,也許"NOW()"需要?)但是,這是連上數據庫更加依賴。

所以我的問題是,這是最乾淨的方式還是取決於案件?

+0

您可以丟棄選項2.不允許將表達式作爲屬性的默認值。屬性初始化必須是一個常量值 - 也就是說,它必須能夠在編譯時進行評估,並且不能依賴運行時信息進行評估。 – arbogastes

+4

這個問題不適合StackOverflow,也許更適合[CodeReview](https://codereview.stackexchange.com/)?即使那樣,也沒有適當的答案,只有意見。正如「乾淨」是一個意見。我會選擇eventlistener(而不是實體)中的選項3,因爲我覺得它更好地分離了關注點 – kero

回答

0

選項1和3是有效的,2是不可能的,4是難以實現的。

如果我通過一個存儲庫中獲得實體從數據庫中,將 構造曾經被稱爲(即新\日期時間()被稱爲是 覆蓋與數據庫值後直接)?

當從數據庫中提取實體時,不會調用構造函數,使用代理對象時,構造函數會在實體加載時覆蓋您的構造函數。然後,構造函數只在第一次創建實體時調用一次。