. */ namespace Doctrine\ORM\Internal; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Event\ListenersInvoker; use Doctrine\ORM\Events; use Doctrine\ORM\UnitOfWork; /** * 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 */ class HydrationCompleteHandler { /** @var \Doctrine\ORM\UnitOfWork */ private $uow; /** @var \Doctrine\ORM\Event\ListenersInvoker */ private $listenersInvoker; /** @var \Doctrine\ORM\EntityManager */ private $em; /** @var array */ private $deferredPostLoadInvocations = array(); /** * Constructor for this object * * @param UnitOfWork $uow * @param \Doctrine\ORM\Event\ListenersInvoker $listenersInvoker * @param \Doctrine\ORM\EntityManager $em * * @since 2.5 */ public function __construct(UnitOfWork $uow, ListenersInvoker $listenersInvoker, EntityManager $em) { $this->uow = $uow; $this->listenersInvoker = $listenersInvoker; $this->em = $em; } /** * Method schedules invoking of postLoad entity to the very end of current hydration cycle. * * @since 2.5 * * @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. * @since 2.5 */ public function hydrationComplete() { $this->invokeAllDeferredPostLoadEvents(); } /** * Method fires all deferred invocations of postLoad events * @since 2.5 */ 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); } } } }