StockLevelListener.php (1896B)
1 <?php 2 3 namespace PartKeepr\PartBundle\Listeners; 4 5 use Doctrine\ORM\Event\OnFlushEventArgs; 6 use PartKeepr\PartBundle\Entity\Part; 7 use PartKeepr\StockBundle\Entity\StockEntry; 8 use Symfony\Component\DependencyInjection\ContainerAware; 9 10 class StockLevelListener extends ContainerAware 11 { 12 /** 13 * Recomputes the stock level for each part. 14 * 15 * @param OnFlushEventArgs $eventArgs The event arguments as given by Doctrine 16 */ 17 public function onFlush(OnFlushEventArgs $eventArgs) 18 { 19 $entityManager = $eventArgs->getEntityManager(); 20 $uow = $entityManager->getUnitOfWork(); 21 22 $parts = []; 23 24 foreach ($uow->getScheduledEntityInsertions() as $updated) { 25 if ($updated instanceof StockEntry) { 26 if (!in_array($updated->getPart(), $parts)) { 27 $parts[] = $updated->getPart(); 28 } 29 } 30 } 31 32 foreach ($uow->getScheduledEntityUpdates() as $updated) { 33 if ($updated instanceof StockEntry) { 34 if (!in_array($updated->getPart(), $parts)) { 35 $parts[] = $updated->getPart(); 36 } 37 } 38 } 39 40 foreach ($parts as $part) { 41 if ($part !== null) { 42 $this->updateStockLevel($part, $eventArgs); 43 } 44 } 45 } 46 47 /** 48 * Updates the stock level for a specific part. 49 * 50 * @param Part $part The part to update 51 * @param OnFlushEventArgs $eventArgs The event arguments 52 */ 53 protected function updateStockLevel(Part $part, OnFlushEventArgs $eventArgs) 54 { 55 $entityManager = $eventArgs->getEntityManager(); 56 57 $part->recomputeStockLevels(); 58 59 $entityManager->getUnitOfWork()->recomputeSingleEntityChangeSet( 60 $entityManager->getClassMetadata(get_class($part)), 61 $part 62 ); 63 } 64 }