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 Symfony侦听器将未更改的日期字段视为已更改,而新日期值和旧日期值相同_Php_Symfony_Datetime_Listener - Fatal编程技术网

Php Symfony侦听器将未更改的日期字段视为已更改,而新日期值和旧日期值相同

Php Symfony侦听器将未更改的日期字段视为已更改,而新日期值和旧日期值相同,php,symfony,datetime,listener,Php,Symfony,Datetime,Listener,也许有人能帮我理解一些我无法在Symfony听众身上解释的事情。以下是主题: 我有一个实体产品,它有一个字段:$creationDate和一个$name 我还有一个ProductListener,可以在实体更改时执行一些其他操作 现在我想更新这个产品名称,所以在我的表单中,我只需输入新名称,单击validate,过程就可以继续,而不需要更改名称 经过一番挖掘,我发现它来自ProductListener,在我的代码的某个地方,我有: if ($event->hasChangedField('

也许有人能帮我理解一些我无法在Symfony听众身上解释的事情。以下是主题:

我有一个实体产品,它有一个字段:
$creationDate
和一个
$name

我还有一个
ProductListener
,可以在实体更改时执行一些其他操作

现在我想更新这个产品名称,所以在我的表单中,我只需输入新名称,单击validate,过程就可以继续,而不需要更改名称

经过一番挖掘,我发现它来自ProductListener,在我的代码的某个地方,我有:

if ($event->hasChangedField('productCreationDate')) {
    $this->handleModification();
}
<> >当我尝试更新产品的<代码> $No./Cuff>时, StuditListAudi/<代码>考虑<代码> $CealDedate < /代码>已经更改(没有)。如果我对此条件进行注释,则
$name
的更新将正确进行

因此,我知道问题来自于这种情况,问题是当
$creationDate
字段没有更改时,它为什么首先输入它

因此,我搜索了为什么侦听器认为
$creationDate
字段已更新。我注意到此字段的旧值和新值的时区不同,因此我更新了代码,如下所示,以确保两者都在时区UTC上:

/**
 *
 * @var DateTimeImmutable
 * @ORM\Column(type="datetime_immutable", nullable=false)
 * @Groups({"product.write", "product.read"})
 * @ApiProperty(attributes={"normalization_context"={
 *  "datetime_format"="Y-m-d H:i:s",
 *  },
 * })
 */
private $dateCreation;
它固定了此字段新旧值之间的时区差

但问题仍然存在。通过调试,我成功地看到了字段
$creationDate
的新值和旧值,它们都等于:

date="2020-07-01 00:00:00.000000"
timezone_type={int}3
timezone="UTC"

date="2020-07-01 00:00:00.000000"
timezone_type={int}3
timezone="UTC"
这个日期在未来这一事实是正常的。但尽管如此,这两个日期都是相同的,我无法找到事件对象的hasChangeField方法为什么会将其视为已更改

ProductListener
的其他方法不考虑
$creationDate
字段。我没有其他条令生命周期事件


这已经发生在任何人身上了吗?有人有一些提示或解决方案吗?谢谢

这完全是瞎猜,但可能是因为日期声明为不可变的吗?不过,
2020-07-01
的值仍然很奇怪。我认为您的源代码并没有显示全部情况。你在控制器里还做了什么?你提到了一个表单,它是什么字段?您是否有任何条令生命周期事件函数,例如运行
PostLoad
?不过,对于这个问题,撤销immutable并没有太大改变,谢谢@msg@Adambean我已经尽我所能更新了我的问题,以回应您的评论,没有运行生命周期事件,并且表单不是问题的来源。我认为我们需要更多地了解您的控制器和事件侦听器,以准确了解您的应用程序是如何运行的
DateTimeImmutable
不正确,但如果意外创建了克隆/刷新实例,则即使更改
DateTime
也仍然相关。