Annotations
3 years ago
EntityTraits
2 years ago
EventListeners
2 years ago
Types
3 years ago
Validator
3 years ago
ArrayCache.php
3 years ago
CacheOnlyMappingDriver.php
3 years ago
ConfigurationFactory.php
3 years ago
ConnectionFactory.php
3 years ago
EntityManagerFactory.php
2 years ago
MetadataCache.php
2 years ago
PSRArrayCache.php
3 years ago
PSRCacheInvalidArgumentException.php
3 years ago
PSRCacheItem.php
3 years ago
PSRMetadataCache.php
3 years ago
ProxyClassNameResolver.php
3 years ago
Repository.php
2 years ago
SerializableConnection.php
3 years ago
TablePrefixMetadataFactory.php
2 years ago
index.php
3 years ago
EntityManagerFactory.php
126 lines
| 1 | <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing |
| 2 | |
| 3 | namespace MailPoet\Doctrine; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Doctrine\EventListeners\EmojiEncodingListener; |
| 9 | use MailPoet\Doctrine\EventListeners\LastSubscribedAtListener; |
| 10 | use MailPoet\Doctrine\EventListeners\NewsletterListener; |
| 11 | use MailPoet\Doctrine\EventListeners\SubscriberListener; |
| 12 | use MailPoet\Doctrine\EventListeners\TimestampListener; |
| 13 | use MailPoet\Doctrine\EventListeners\ValidationListener; |
| 14 | use MailPoet\Tracy\DoctrinePanel\DoctrinePanel; |
| 15 | use MailPoetVendor\Doctrine\DBAL\Connection; |
| 16 | use MailPoetVendor\Doctrine\ORM\Configuration; |
| 17 | use MailPoetVendor\Doctrine\ORM\EntityManager; |
| 18 | use MailPoetVendor\Doctrine\ORM\Events; |
| 19 | use Tracy\Debugger; |
| 20 | |
| 21 | class EntityManagerFactory { |
| 22 | |
| 23 | /** @var Connection */ |
| 24 | private $connection; |
| 25 | |
| 26 | /** @var Configuration */ |
| 27 | private $configuration; |
| 28 | |
| 29 | /** @var TimestampListener */ |
| 30 | private $timestampListener; |
| 31 | |
| 32 | /** @var ValidationListener */ |
| 33 | private $validationListener; |
| 34 | |
| 35 | /** @var EmojiEncodingListener */ |
| 36 | private $emojiEncodingListener; |
| 37 | |
| 38 | /** @var LastSubscribedAtListener */ |
| 39 | private $lastSubscribedAtListener; |
| 40 | |
| 41 | /** @var SubscriberListener */ |
| 42 | private $subscriberListener; |
| 43 | |
| 44 | private NewsletterListener $newsletterListener; |
| 45 | |
| 46 | public function __construct( |
| 47 | Connection $connection, |
| 48 | Configuration $configuration, |
| 49 | TimestampListener $timestampListener, |
| 50 | ValidationListener $validationListener, |
| 51 | EmojiEncodingListener $emojiEncodingListener, |
| 52 | LastSubscribedAtListener $lastSubscribedAtListener, |
| 53 | NewsletterListener $newsletterListener, |
| 54 | SubscriberListener $subscriberListener |
| 55 | ) { |
| 56 | $this->connection = $connection; |
| 57 | $this->configuration = $configuration; |
| 58 | $this->timestampListener = $timestampListener; |
| 59 | $this->validationListener = $validationListener; |
| 60 | $this->emojiEncodingListener = $emojiEncodingListener; |
| 61 | $this->lastSubscribedAtListener = $lastSubscribedAtListener; |
| 62 | $this->subscriberListener = $subscriberListener; |
| 63 | $this->newsletterListener = $newsletterListener; |
| 64 | } |
| 65 | |
| 66 | public function createEntityManager(): EntityManager { |
| 67 | $entityManager = EntityManager::create($this->connection, $this->configuration); |
| 68 | $this->cleanupListeners($entityManager); |
| 69 | $this->setupListeners($entityManager); |
| 70 | if ( |
| 71 | class_exists(Debugger::class) |
| 72 | && class_exists(DoctrinePanel::class) |
| 73 | ) { |
| 74 | DoctrinePanel::init($entityManager); |
| 75 | } |
| 76 | return $entityManager; |
| 77 | } |
| 78 | |
| 79 | /** |
| 80 | * We sometimes work with more EntityManager in tests, and the behavior could be inconsistent with multiple listeners |
| 81 | */ |
| 82 | private function cleanupListeners(EntityManager $entityManager) { |
| 83 | $eventManager = $entityManager->getEventManager(); |
| 84 | foreach ($eventManager->getListeners() as $event => $listeners) { |
| 85 | if (!is_array($listeners)) { |
| 86 | $eventManager->removeEventListener($event, $listeners); |
| 87 | continue; |
| 88 | } |
| 89 | foreach ($listeners as $listener) { |
| 90 | $eventManager->removeEventListener($event, $listener); |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | $entityManager->getConfiguration()->getEntityListenerResolver()->clear(SubscriberListener::class); |
| 95 | } |
| 96 | |
| 97 | private function setupListeners(EntityManager $entityManager) { |
| 98 | $entityManager->getEventManager()->addEventListener( |
| 99 | [Events::prePersist, Events::preUpdate], |
| 100 | $this->timestampListener |
| 101 | ); |
| 102 | |
| 103 | $entityManager->getEventManager()->addEventListener( |
| 104 | [Events::onFlush], |
| 105 | $this->validationListener |
| 106 | ); |
| 107 | |
| 108 | $entityManager->getEventManager()->addEventListener( |
| 109 | [Events::prePersist, Events::preUpdate], |
| 110 | $this->emojiEncodingListener |
| 111 | ); |
| 112 | |
| 113 | $entityManager->getEventManager()->addEventListener( |
| 114 | [Events::prePersist, Events::preUpdate], |
| 115 | $this->lastSubscribedAtListener |
| 116 | ); |
| 117 | |
| 118 | $entityManager->getEventManager()->addEventListener( |
| 119 | [Events::preUpdate], |
| 120 | $this->newsletterListener |
| 121 | ); |
| 122 | |
| 123 | $entityManager->getConfiguration()->getEntityListenerResolver()->register($this->subscriberListener); |
| 124 | } |
| 125 | } |
| 126 |