我正在使用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)
最后一部分是将实体配置为使用该实体侦听器。