在我的symfony应用程序中,我有了event_subscriber
rake db:migrate:status
我的订阅者只需收听postPersist和postUpdate事件:
CoreBundle\EventSubscriber\CloseIssueSubscriber:
tags:
- { name: doctrine_mongodb.odm.event_subscriber, connection: default }
在我的索引函数中,我需要做的是获取特定字段是否已更改,特别是issue.status字段。
public function getSubscribedEvents()
{
return array(
'postPersist',
'postUpdate',
);
}
public function postPersist(LifecycleEventArgs $args)
{
$this->index($args);
}
public function postUpdate(LifecycleEventArgs $args)
{
$this->index($args);
}
在我的测试中,我所做的是更改issue.status字段,所以我希望从var_dump中获得2个不同的值,但我从两个中获得最后一个状态。
我的文件就是这样的:
public function index(LifecycleEventArgs $args)
{
$document = $args->getEntity();
$originalData = $uow->getOriginalDocumentData($document);
$originalStatus = $originalData && !empty($originalData['issue']) ? $originalData['issue']->getStatus() : null;
var_dump($originalStatus);
var_dump($document->getIssue()->getStatus());die;
}
}
在嵌入式问题文档中,状态只是一个文本字段。
我也尝试使用变更集:
class Payload
{
/**
* @ODM\Id
*/
private $id;
/**
* @ODM\EmbedOne(targetDocument="CoreBundle\Document\Issue\Issue")
* @Type("CoreBundle\Document\Issue\Issue")
*/
protected $issue;
这两个var_dumps也会返回相同的状态。
答案 0 :(得分:1)
到postUpdate
时,文档中的更改已经完成,因此调整了originalDocumentData
并准备好进行新的计算。相反,您应该挂钩preUpdate
事件并在那里使用$uow->getDocumentChangeSet($document);
。
我想你一旦将更改写入数据库就想运行index
,所以在preUpdate
上你可以在监听器中累积更改并另外挂钩postFlush
事件来重新启动 - 索引文件。
答案 1 :(得分:0)
我找到了解决问题的方法。 malarzm在另一个答案中所说的是正确的,但不能解决我的问题 我想我只为文档(Payload)获得了一个postUpdate / preUpdate postPersist / prePersist而不是我注意到它被嵌入文档调用了事件(不知道为什么教义认为它是持久的)。
所以主要的问题是我在等待Payload对象而不是等待一个Issue对象。
在另一方面,即使在postUpdate和preUpdate中我也无法使用getOriginalDocumentData工作,所以我必须使用getDocumentChangeSet()。