. */ namespace Doctrine\ORM\Internal; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Event\ListenersInvoker; use Doctrine\ORM\Events; /** * Class, which can handle completion of hydration cycle and produce some of tasks. * In current implementation triggers deferred postLoad event. * * TODO Move deferred eager loading here * * @author Artur Eshenbrener * @since 2.5 */ final class HydrationCompleteHandler { /** * @var ListenersInvoker */ private $listenersInvoker; /** * @var EntityManagerInterface */ private $em; /** * @var array[] */ private $deferredPostLoadInvocations = array(); /** * Constructor for this object * * @param ListenersInvoker $listenersInvoker * @param EntityManagerInterface $em */ public function __construct(ListenersInvoker $listenersInvoker, EntityManagerInterface $em) { $this->listenersInvoker = $listenersInvoker; $this->em = $em; } /** * Method schedules invoking of postLoad entity to the very end of current hydration cycle. * * @param ClassMetadata $class * @param object $entity */ public function deferPostLoadInvoking(ClassMetadata $class, $entity) { $this->deferredPostLoadInvocations[] = array($class, $entity); } /** * This method should me called after any hydration cycle completed. */ public function hydrationComplete() { $this->invokeAllDeferredPostLoadEvents(); } /** * Method fires all deferred invocations of postLoad events */ private function invokeAllDeferredPostLoadEvents() { $toInvoke = $this->deferredPostLoadInvocations; $this->deferredPostLoadInvocations = array(); foreach ($toInvoke as $classAndEntity) { list($class, $entity) = $classAndEntity; $invoke = $this->listenersInvoker->getSubscribedSystems($class, Events::postLoad); if ($invoke !== ListenersInvoker::INVOKE_NONE) { $this->listenersInvoker->invoke($class, Events::postLoad, $entity, new LifecycleEventArgs($entity, $this->em), $invoke); } } } }