Created
January 16, 2018 16:45
-
-
Save arnegroskurth/9472b6e495f737154bdd5e0f5e922f21 to your computer and use it in GitHub Desktop.
MuZ - Derived Property example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Muz\Beesite\Backend\DataStorage\EventListener; | |
use Doctrine\Common\EventSubscriber; | |
use Doctrine\ORM\Event\OnFlushEventArgs; | |
use Doctrine\ORM\Events; | |
/** | |
* @see http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners | |
* | |
* To subscriber has to be registered at application bootstrap like this: | |
* | |
* $entityManager = $serviceManager->get(EntityManager::class); | |
* $entityManager->getEventManager()->addEventSubscriber(new SetDerivedPropertyEventSubscriber()); | |
*/ | |
class SetDerivedPropertyEventSubscriber implements EventSubscriber | |
{ | |
public function getSubscribedEvents() | |
{ | |
return [ | |
Events::onFlush, | |
]; | |
} | |
public function onFlush(OnFlushEventArgs $args) | |
{ | |
$em = $args->getEntityManager(); | |
$uow = $em->getUnitOfWork(); | |
$deletedObjectIds = array_filter(array_map(function($object) { | |
if ($object instanceof \Muz\Entity\Test2) | |
{ | |
return $object->getId(); | |
} | |
return null; | |
}, $uow->getScheduledEntityDeletions())); | |
$changeSet = array_merge( | |
$uow->getScheduledEntityInsertions(), | |
$uow->getScheduledEntityUpdates(), | |
$uow->getScheduledEntityDeletions() | |
); | |
foreach ($changeSet as $object) | |
{ | |
if (!($object instanceof \Muz\Entity\Test2) || !$object->getTest()) | |
{ | |
continue; | |
} | |
/** @var \Muz\Entity\Test2 $object */ | |
// only consider related objects not scheduled for deletion | |
$relatedObjects = array_filter($object->getTest()->getTest2(), function(\Muz\Entity\Test2 $relatedObject) use ($deletedObjectIds) { | |
return !in_array($relatedObject->getId(), $deletedObjectIds); | |
}); | |
// update derived property | |
$object->getTest()->setDerived(implode(' ', array_map(function(\Muz\Entity\Test2 $test2) { return $test2->getX(); }, $relatedObjects))); | |
// doctrine has to be informed about an updated property of a related object | |
$uow->recomputeSingleEntityChangeSet($em->getClassMetadata(\Muz\Entity\Test::class), $object->getTest()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment