我已经遇到了几次这个问题,我永远不确定处理它的最佳/最清洁方法。我想在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((称为 直接用数据库值覆盖(?
当从数据库中获取实体时,未调用构造函数,说学说使用代理对象并在加载实体时覆盖构造函数。然后仅在第一次创建实体时一次调用构造函数。