我已經有過這個問題幾次,我不知道最好/最乾淨的方式來處理它。我想在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()"
需要?)但是,這是連上數據庫更加依賴。
所以我的問題是,這是最乾淨的方式還是取決於案件?
您可以丟棄選項2.不允許將表達式作爲屬性的默認值。屬性初始化必須是一個常量值 - 也就是說,它必須能夠在編譯時進行評估,並且不能依賴運行時信息進行評估。 – arbogastes
這個問題不適合StackOverflow,也許更適合[CodeReview](https://codereview.stackexchange.com/)?即使那樣,也沒有適當的答案,只有意見。正如「乾淨」是一個意見。我會選擇eventlistener(而不是實體)中的選項3,因爲我覺得它更好地分離了關注點 – kero