在SoftDeleteable Listener中使用propertyChanged()方法的目的是什么?
任何动作都可以完美运行。 按照Doctrine的说法,propertyChanged()将实体中的属性更改通知此UnitOfWork。 通知,下一步是什么?
class SoftDeleteableListener extends MappedEventSubscriber
{
/**
* Pre soft-delete event
*
* @var string
*/
const PRE_SOFT_DELETE = "preSoftDelete";
/**
* Post soft-delete event
*
* @var string
*/
const POST_SOFT_DELETE = "postSoftDelete";
/**
* {@inheritdoc}
*/
public function getSubscribedEvents()
{
return array(
'loadClassMetadata',
'onFlush',
);
}
/**
* If it's a SoftDeleteable object, update the "deletedAt" field
* and skip the removal of the object
*
* @param EventArgs $args
*
* @return void
*/
public function onFlush(EventArgs $args)
{
$ea = $this->getEventAdapter($args);
$om = $ea->getObjectManager();
$uow = $om->getUnitOfWork();
$evm = $om->getEventManager();
//getScheduledDocumentDeletions
foreach ($ea->getScheduledObjectDeletions($uow) as $object) {
$meta = $om->getClassMetadata(get_class($object));
$config = $this->getConfiguration($om, $meta->name);
if (isset($config['softDeleteable']) && $config['softDeleteable']) {
$reflProp = $meta->getReflectionProperty($config['fieldName']);
$oldValue = $reflProp->getValue($object);
$date = new \DateTime();
// Remove `$oldValue instanceof \DateTime` check when PHP version is bumped to >=5.5
if (isset($config['hardDelete']) && $config['hardDelete'] && ($oldValue instanceof \DateTime || $oldValue instanceof \DateTimeInterface) && $oldValue <= $date) {
continue; // want to hard delete
}
$evm->dispatchEvent(
self::PRE_SOFT_DELETE,
$ea->createLifecycleEventArgsInstance($object, $om)
);
$reflProp->setValue($object, $date);
$om->persist($object);
$uow->propertyChanged($object, $config['fieldName'], $oldValue, $date);
if ($uow instanceof MongoDBUnitOfWork && !method_exists($uow, 'scheduleExtraUpdate')) {
$ea->recomputeSingleObjectChangeSet($uow, $meta, $object);
} else {
$uow->scheduleExtraUpdate($object, array(
$config['fieldName'] => array($oldValue, $date),
));
}
$evm->dispatchEvent(
self::POST_SOFT_DELETE,
$ea->createLifecycleEventArgsInstance($object, $om)
);
}
}
}