【问题标题】:SonataAdminBundle - check changes in `preUpdate` hookSonataAdminBundle - 检查 `preUpdate` 挂钩中的更改
【发布时间】:2014-02-28 16:22:52
【问题描述】:

是否可以检查preUpdate 钩子上的字段是否已更改?我正在寻找类似 @​​987654322@ hasChangedField($fieldName) Doctrine 功能的东西。有什么想法吗?

【问题讨论】:

    标签: symfony doctrine-orm sonata-admin


    【解决方案1】:

    对我来说,在 Sonata Admin 中最好的方法是:

    $newField = $this->getForm()->get('field')->getData();
    $oldField = $this->getForm()->get('field')->getConfig()->getData();
    

    除非别无选择,否则不应使用工作单元。此外,如果您有未映射的字段,则无法通过实体对象访问它。

    在正常的 Doctrine 生命周期事件中,最佳选择是 Doctrine preupdate event doc

    【讨论】:

    • 对我来说 $oldField 为空
    【解决方案2】:

    这个问题有点像this one

    您的解决方案只是将旧对象的字段与新对象的字段进行比较,看看它们有何不同。

    例如:

    public function preUpdate($newObject)
    {
        $em = $this->getModelManager()->getEntityManager($this->getClass());
        $originalObject = $em->getUnitOfWork()->getOriginalEntityData($newObject);
    
        if ($newObject->getSomeField() !== $originalObject['fieldName']) {
            // Field has been changed
        }
    }
    

    【讨论】:

    • 谢谢!这很有帮助。但是这种情况应该适用于 mongoDB (getOriginalDocumentData),对于 mysql,我使用了 getOriginalEntityData。此外,该函数返回数组,所以我必须通过$originalObject['fieldName'] 引用。如果您能更新您的答案,那就太好了。
    • 你说得对,我更正了我的答案。很高兴我能帮上忙!
    • 很好的答案,但是我们有办法用 postUpdate() 做到这一点吗?
    猜你喜欢
    • 2016-12-28
    • 2015-02-17
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2018-03-17
    • 2017-02-19
    相关资源
    最近更新 更多