Php 在对象中设置createdAt时间戳/日期时间的最干净方法
我已经有过好几次这样的问题了,我从来都不确定最好/最干净的处理方法。我想在Symfony类/对象中创建一个Php 在对象中设置createdAt时间戳/日期时间的最干净方法,php,symfony,class,doctrine,Php,Symfony,Class,Doctrine,我已经有过好几次这样的问题了,我从来都不确定最好/最干净的处理方法。我想在Symfony类/对象中创建一个createdAt(timestamp/datetime)字段。我知道有几种处理方法,但我想问是否有一种“最干净”的方法 选项1:在构造函数中创建(当前收藏夹) 我最喜欢这个,因为它是明确的,并且是在“构建”期间设置的 一个相关的问题是,如果我通过存储库从数据库中获取一个实体,是否会调用构造函数(即调用new\DateTime()以直接用数据库值覆盖) 选项2:类中的默认值 class My
createdAt
(timestamp/datetime)字段。我知道有几种处理方法,但我想问是否有一种“最干净”的方法
选项1:在构造函数中创建(当前收藏夹)
我最喜欢这个,因为它是明确的,并且是在“构建”期间设置的
一个相关的问题是,如果我通过存储库从数据库中获取一个实体,是否会调用构造函数(即调用new\DateTime()
以直接用数据库值覆盖)
选项2:类中的默认值
class MyClass {
protected $createdAt = new \DateTime();
/** ... */
}
我想这很好吧
选项3:生命周期回调
/**
* @PrePersist
*/
public function onPrePersistCreated()
{
$this->createdAt = new \DateTime();
}
我觉得这有点不公平,因为这有点副作用,但也许还可以。另一个缺点是,我必须等待它被持久化到数据库,以便获得createdAt
类似的方法是使用DoctrineExtensions'timestable
选项4:数据库中的默认值
在Symfony类条令注释中,您可以为$createdAt
设置默认值,但我发现这有点不稳定。差不多
/**
* @var \DateTime
* @ORM\Column(name="created_at", type="datetime", options={"default" : "CURRENT_TIMESTAMP"})
*/
(没有测试代码,可能需要“NOW()”
)但这更依赖于数据库
所以我的问题是,哪种方式最干净,还是取决于具体情况?选项1和3有效,2不可能,4难以实施 如果我通过存储库从数据库中获取一个实体 是否调用过构造函数(即调用new\DateTime()以 之后直接用数据库值覆盖)
从数据库获取实体时不调用构造函数,在加载实体时使用代理对象并重写构造函数。当第一次创建实体时,只调用一次中的构造函数。选项1和3有效,2不可能,4难以实现 如果我通过存储库从数据库中获取一个实体 是否调用过构造函数(即调用new\DateTime()以 之后直接用数据库值覆盖)
从数据库获取实体时不调用构造函数,在加载实体时使用代理对象并重写构造函数。然后,在第一次创建实体时,只调用一次中的构造函数。您可以放弃选项2。不允许将表达式作为属性默认值。属性初始化,必须是一个常量值-也就是说,它必须能够在编译时进行计算,并且不能依赖于运行时信息进行计算。这个问题不适合StackOverflow,可能更适合?即使如此,也没有正确的答案,只有意见。正如“干净”是一种观点。我会选择eventlistener中的选项3(而不是实体),因为我觉得它可以更好地分离关注点,您可以放弃选项2。不允许将表达式作为属性默认值。属性初始化,必须是一个常量值-也就是说,它必须能够在编译时进行计算,并且不能依赖于运行时信息进行计算。这个问题不适合StackOverflow,可能更适合?即使如此,也没有正确的答案,只有意见。正如“干净”是一种观点。我会选择eventlistener中的选项3(而不是实体),因为我觉得它能更好地分离关注点
/**
* @var \DateTime
* @ORM\Column(name="created_at", type="datetime", options={"default" : "CURRENT_TIMESTAMP"})
*/