在对象中设置创建时间戳 / dateTime的最清洁方法



我已经遇到了几次这个问题,我永远不确定处理它的最佳/最清洁方法。我想在Symfony类/对象中创建一个createdAt(Timestamp/dateTime(字段。我知道有几种处理方法,但是我想问一下是否有一种"最清洁"的方法。

选项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();
}

我觉得这有点不确定,因为它有些副作用,但也许还可以。另一个缺点是,我必须等待它坚持到数据库才能获得createdAt

类似的是使用DoctrineExtensions'Timestampable

选项4:数据库中的默认值

在Symfony类学说注释中,您可以为$createdAt设置默认值,但是我发现这有点不稳定。像

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

(没有测试代码,也许需要"NOW()"?(,但这更依赖于数据库。

所以我的问题是,哪种是最干净的方法或取决于情况?

选项1和3是有效的,不可能2,而4很难实现。

如果我通过存储库从数据库中获得实体,将 构造器曾经被称为(即新 dateTime((称为 直接用数据库值覆盖(?

当从数据库中获取实体时,未调用构造函数,说学说使用代理对象并在加载实体时覆盖构造函数。然后仅在第一次创建实体时一次调用构造函数。

最新更新