Skip to content

Instantly share code, notes, and snippets.

@arnegroskurth
Created January 16, 2018 16:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arnegroskurth/9472b6e495f737154bdd5e0f5e922f21 to your computer and use it in GitHub Desktop.
Save arnegroskurth/9472b6e495f737154bdd5e0f5e922f21 to your computer and use it in GitHub Desktop.
MuZ - Derived Property example
<?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