connection = $connection; $this->configuration = $configuration; $this->timestampListener = $timestampListener; $this->validationListener = $validationListener; $this->emojiEncodingListener = $emojiEncodingListener; $this->lastSubscribedAtListener = $lastSubscribedAtListener; $this->subscriberListener = $subscriberListener; } public function createEntityManager(): EntityManager { $entityManager = EntityManager::create($this->connection, $this->configuration); $this->cleanupListeners($entityManager); $this->setupListeners($entityManager); if ( class_exists(Debugger::class) && class_exists(DoctrinePanel::class) ) { DoctrinePanel::init($entityManager); } return $entityManager; } /** * We sometimes work with more EntityManager in tests, and the behavior could be inconsistent with multiple listeners */ private function cleanupListeners(EntityManager $entityManager) { $eventManager = $entityManager->getEventManager(); foreach ($eventManager->getListeners() as $event => $listeners) { if (!is_array($listeners)) { $eventManager->removeEventListener($event, $listeners); continue; } foreach ($listeners as $listener) { $eventManager->removeEventListener($event, $listener); } } $entityManager->getConfiguration()->getEntityListenerResolver()->clear(SubscriberListener::class); } private function setupListeners(EntityManager $entityManager) { $entityManager->getEventManager()->addEventListener( [Events::prePersist, Events::preUpdate], $this->timestampListener ); $entityManager->getEventManager()->addEventListener( [Events::onFlush], $this->validationListener ); $entityManager->getEventManager()->addEventListener( [Events::prePersist, Events::preUpdate], $this->emojiEncodingListener ); $entityManager->getEventManager()->addEventListener( [Events::prePersist, Events::preUpdate], $this->lastSubscribedAtListener ); $entityManager->getConfiguration()->getEntityListenerResolver()->register($this->subscriberListener); } }