Symfony/条令检测到“的变化”;“金钱”;字段,即使未发生任何更改?

Symfony/条令检测到“的变化”;“金钱”;字段,即使未发生任何更改?,symfony,doctrine-orm,Symfony,Doctrine Orm,我的表格上有一组“实体a”记录。“实体A”的一个属性如下: /** * @var float * * @ORM\Column(name="amount", type="decimal", precision=65, scale=2, nullable=true) */ private $amount; 当我提交包含表单时,即使绝对没有任何更改,原则也会为集合中的每个“实体a”对象触发一个预更新事件。变更集如下所示: array:1 [▼ "amount" => array:2

我的表格上有一组“实体a”记录。“实体A”的一个属性如下:

/**
 * @var float
 *
 * @ORM\Column(name="amount", type="decimal", precision=65, scale=2, nullable=true)
 */
private $amount;
当我提交包含表单时,即使绝对没有任何更改,原则也会为集合中的每个“实体a”对象触发一个预更新事件。变更集如下所示:

array:1 [▼
  "amount" => array:2 [▼
    0 => "5.00"
    1 => 5.0
  ]
]
显然是类型转换问题,但我如何防止这种情况?我真的必须检查变更集中的每个属性并验证它是否确实发生了更改吗


我还尝试了“数字”表单类型,结果相同。

我认为预更新没有问题。它应该是这样工作的。 如果查看代码,则在评估变更集之前,在任何情况下都会调用
preUpdate

php第1063-1070行

private function executeUpdates($class) 
{
    // .........
            if ($preUpdateInvoke != ListenersInvoker::INVOKE_NONE) {
            $this->listenersInvoker->invoke($class, Events::preUpdate, $entity, new PreUpdateEventArgs($entity, $this->em, $this->entityChangeSets[$oid]), $preUpdateInvoke);
            $this->recomputeSingleEntityChangeSet($class, $entity);
        }
        if ( ! empty($this->entityChangeSets[$oid])) {
            $persister->update($entity);
        }
    //.........
}
同时,变更集不正确的问题仍然存在。除了在表单到达实体之前过滤表单中的值之外,我看不到任何其他修复方法。这是另一个问题

以下是确定实体变更的代码。这是
==

        if ($orgValue !== $actualValue) {
            $changeSet[$propName] = array($orgValue, $actualValue);
        }

我认为预更新没有问题。它应该是这样工作的。 如果查看代码,则在评估变更集之前,在任何情况下都会调用
preUpdate

php第1063-1070行

private function executeUpdates($class) 
{
    // .........
            if ($preUpdateInvoke != ListenersInvoker::INVOKE_NONE) {
            $this->listenersInvoker->invoke($class, Events::preUpdate, $entity, new PreUpdateEventArgs($entity, $this->em, $this->entityChangeSets[$oid]), $preUpdateInvoke);
            $this->recomputeSingleEntityChangeSet($class, $entity);
        }
        if ( ! empty($this->entityChangeSets[$oid])) {
            $persister->update($entity);
        }
    //.........
}
同时,变更集不正确的问题仍然存在。除了在表单到达实体之前过滤表单中的值之外,我看不到任何其他修复方法。这是另一个问题

以下是确定实体变更的代码。这是
==

        if ($orgValue !== $actualValue) {
            $changeSet[$propName] = array($orgValue, $actualValue);
        }

谢谢你的回复!这很有帮助。关于预更新,您是对的,真正的问题是变更集本质上是不正确的。在我看来,修复需要在Symfony的表单处理代码中的某个地方?货币或数字字段中的值在传递给条令之前应转换为适当的类型。感谢您的回复!这很有帮助。关于预更新,您是对的,真正的问题是变更集本质上是不正确的。在我看来,修复需要在Symfony的表单处理代码中的某个地方?货币或数字字段中的值在传递给条令之前应转换为适当的类型。