Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在对象中设置createdAt时间戳/日期时间的最干净方法_Php_Symfony_Class_Doctrine - Fatal编程技术网

Php 在对象中设置createdAt时间戳/日期时间的最干净方法

Php 在对象中设置createdAt时间戳/日期时间的最干净方法,php,symfony,class,doctrine,Php,Symfony,Class,Doctrine,我已经有过好几次这样的问题了,我从来都不确定最好/最干净的处理方法。我想在Symfony类/对象中创建一个createdAt(timestamp/datetime)字段。我知道有几种处理方法,但我想问是否有一种“最干净”的方法 选项1:在构造函数中创建(当前收藏夹) 我最喜欢这个,因为它是明确的,并且是在“构建”期间设置的 一个相关的问题是,如果我通过存储库从数据库中获取一个实体,是否会调用构造函数(即调用new\DateTime()以直接用数据库值覆盖) 选项2:类中的默认值 class My

我已经有过好几次这样的问题了,我从来都不确定最好/最干净的处理方法。我想在Symfony类/对象中创建一个
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"})
*/