【问题标题】:Do something when one special field changes (doctrine)当一个特殊领域发生变化时做某事(教义)
【发布时间】:2014-10-28 08:52:56
【问题描述】:

我将 symfony2 与教义一起使用。 当实体的特殊属性发生变化时,我想做一些更改;实际上我想保存我的属性的更改并了解它的更改状态。 例如,当任何字段更改与更改的字段名称相关时,我怎么能说。

例如,如果电子邮件发生更改,则向其他实体添加一些行。

谢谢。

【问题讨论】:

    标签: symfony doctrine-orm updates


    【解决方案1】:

    您应该能够使用 Doctrine Listeners 和 UnitOfWork 变更集做一些事情,如下所示:

    use Doctrine\ORM\Event\LifecycleEventArgs;
    
    class DoctrineListener
    {
        public function preUpdate(LifecycleEventArgs $args)
        {
            $entity = $args->getEntity();
            $entityManager = $args->getEntityManager();
    
            if ($entity instanceof MyEntityClass) {
                $changeSet = $entityManager->getUnitOfWork()->getEntityChangeSet($entity);
                if (isset($changeSet['my_field'])) {
                    //do something here
                }
            }
        }
    }
    

    例如,这就是某些 Doctrine 扩展注册其更改的方式。

    【讨论】:

    • 感谢您的回答 :),据我所知,这将在任何更新之前运行,对吗?那么它的表现如何呢?
    • 是的,“preUpdate”Doctrine 事件在实体即将更新时触发(实体存在,并且在调用persist 之前对其应用了一些更改)。我不确定你的问题。 “性能”?
    • 我的意思是它在服务器上的负载是多少?最好在您的操作中手动检查属性更改或拥有这种侦听器?
    • 对我来说,这不是性能问题,而是代码设计问题。你可以在控制器上做任何事情,但要考虑代码的可重用性。这是框架的最佳实践:瘦控制器。为了回答您的问题,您可以使用事件侦听器,该组件已优化,并被所有 Doctrine 社区使用! :)
    【解决方案2】:

    除了 Yan 的回答之外,Doctrine 已经有了满足您需求的方法,例如 hasChangedFieldgetNewValue.. 你可以在这里阅读更多:

    http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#preupdate

    【讨论】:

    • 当我阅读文档时,它说如果您想更改实体关联,它不可用.. 由于当前实体的更改,我想添加或删除另一个实体.. 你有有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多