我已经有过几次这个问题了,我从来不确定最好/最干净的方法来处理它。我想在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类Doctrine注释中,您可以为$createdAt
设置默认值,但我觉得这有点不稳定。像
/**
* @var \DateTime
* @ORM\Column(name="created_at", type="datetime", options={"default" : "CURRENT_TIMESTAMP"})
*/
(没有测试代码,可能需要"NOW()"
?)但这更依赖于数据库。
所以我的问题是,这是最干净的方式还是依赖于案例?
答案 0 :(得分:0)
选项1和3有效,2不可能,4很难实现。
如果我通过存储库从数据库中获取实体,那么 构造函数永远被调用(即new \ DateTime()被调用 直接用数据库值覆盖)?
从数据库中获取实体时不调用构造函数,doctrine使用Proxy对象并在加载实体时覆盖构造函数。然后构造函数只在第一次创建实体时调用一次。