Symfony Entity Listener getEntityChangeSet Specific fields



我正在使用Symfony 3.4,我有一个实体侦听器来检查我的实体用户的更改:

服务.yml

    AppBundleEventListenerEntityListener:
    tags:
        - { name: doctrine.event_listener, event: preUpdate }

实体侦听器

<?php
namespace AppBundleEventListener;
use AppBundleEntityUser;
use DoctrineORMEventPreUpdateEventArgs;
class EntityListener
{
    public function preUpdate(PreUpdateEventArgs $eventArgs)
    {
        if (!$eventArgs->getEntity() instanceof User) {
            return;
        }
        $changeArray = $eventArgs->getEntityChangeSet();
        var_dump($changeArray);
    }
}

所以有了这段代码,如果我用以下方法更新我的用户:

    $this->getUser()->setFirstname(uniqid());
    $this->getDoctrine()->getManager()->flush();

触发事件preUpdate,我检索$changeArray如下内容:

array(1) {
  ["firstname"]=>
  array(2) {
    [0]=>
    string(13) "5a5e1218c1026"
    [1]=>
    string(13) "5a5e123647f7d"
  }
}

所以这是完美的,我得到了一个带有旧 => 新值的数组,我的问题是:

如果我想排除/包含某些字段,该怎么办?我不想在 User 中的所有字段上侦听并触发 preUpdate 事件,但我不想一一检查我的$changeArray(foreach =>检查$key =>如果$key==xxxx...(。

有什么想法吗?也许是对此的注释?指定我要侦听哪些字段的方法?

据我所知,没有办法将某些字段排除在触发生命周期事件之外,同时保持其余学说的行为相同。如果您看一下 Doctrine 的UnitOfWork,您可以看到,如果无论更改集的内容如何,都会为特定类调度预更新事件。

因此,如果要排除某些字段,实际上必须通过检查更改集的内容来筛选它们。 PreUpdateEventArgs有一个名为hasChangedField的方法可以帮助您解决此问题,但您仍然必须在侦听器中自己编写排除/包含条件。


话虽如此,您可以通过阻止这些字段更改触发更新来防止为某些字段触发preUpdate。如果这就是您所追求的,则必须更改实体的跟踪策略并选择文档中说明的NOTIFY策略。

您的类名建议EntityListener但您将其注册为 EventListener 。它们之间是有区别的。用doctrine.orm.entity_listener标记您的EntityListener 并将preUpdate方法更改为类似以下内容:

public function preUpdate($entity, PreUpdateEventArgs $eventArgs)

最后一部分是将实体配置为使用该实体侦听器。

最新更新