From fa459b647a691813e4a17cd243aa0a3a36a18567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Einar=20Gangs=C3=B8?= Date: Mon, 25 Nov 2019 07:21:10 +0100 Subject: [PATCH] Define your own EventManager with doctrine.managers.[manager].event_manager Fixes #408 --- src/EntityManagerFactory.php | 24 +++++++++++++- tests/EntityManagerFactoryTest.php | 50 ++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/EntityManagerFactory.php b/src/EntityManagerFactory.php index 40250003..d6a29e01 100644 --- a/src/EntityManagerFactory.php +++ b/src/EntityManagerFactory.php @@ -3,6 +3,7 @@ namespace LaravelDoctrine\ORM; use Doctrine\Common\Cache\Cache; +use Doctrine\Common\EventManager; use Doctrine\ORM\Cache\DefaultCacheFactory; use Doctrine\ORM\Configuration; use Doctrine\ORM\EntityManager; @@ -104,6 +105,8 @@ public function create(array $settings = []) $this->setMetadataDriver($settings, $configuration); + $eventManager = $this->createEventManager($settings); + $driver = $this->getConnectionDriver($settings); $connection = $this->connection->driver( @@ -133,7 +136,8 @@ public function create(array $settings = []) $manager = EntityManager::create( $connection, - $configuration + $configuration, + $eventManager ); $manager = $this->decorateManager($settings, $manager); @@ -460,6 +464,24 @@ protected function registerMappingTypes(array $settings = [], EntityManagerInter } } + /** + * @param array $settings + * + * @return null|EventManager + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + private function createEventManager(array $settings = []) + { + $customEventManager = Arr::get($settings, 'event_manager'); + + if (!$customEventManager) { + return null; + } + + return $this->container->make($customEventManager); + } + /** * Check if master slave connection was being configured. * diff --git a/tests/EntityManagerFactoryTest.php b/tests/EntityManagerFactoryTest.php index 9fc405de..c1c4c863 100644 --- a/tests/EntityManagerFactoryTest.php +++ b/tests/EntityManagerFactoryTest.php @@ -528,6 +528,52 @@ public function test_wrapper_connection() $this->assertInstanceOf(FakeConnection::class, $manager->getConnection()); } + public function test_custom_event_manager() + { + m::resetContainer(); + + $config = new ConfigRepository([ + 'database.connections.mysql' => [ + 'driver' => 'mysql' + ], + 'doctrine' => [ + 'meta' => 'annotations', + 'connection' => 'mysql', + 'paths' => ['Entities'], + 'proxies' => [ + 'path' => 'dir', + 'auto_generate' => false, + 'namespace' => 'namespace' + ], + 'event_manager' => 'my_event_manager' + ], + 'doctrine.custom_datetime_functions' => [], + 'doctrine.custom_numeric_functions' => [], + 'doctrine.custom_string_functions' => [] + ]); + + $container = new \Illuminate\Container\Container(); + $container->singleton(Repository::class, function () use ($config) { + return $config; + }); + + $container->alias(FakeEventManager::class, 'my_event_manager'); + + $factory = new EntityManagerFactory( + $container, + new Setup(), + new MetaDataManager($container), + new ConnectionManager($container), + new CacheManager($container), + $config, + new EntityListenerResolver($container) + ); + + $manager = $factory->create($config->get('doctrine')); + + $this->assertInstanceOf(FakeEventManager::class, $manager->getEventManager()); + } + /** * MOCKS * @@ -917,6 +963,10 @@ private function getDummyBaseInputConfig() } } +class FakeEventManager extends \Doctrine\Common\EventManager +{ +} + class FakeConnection extends Connection { }