Skip to content

Commit

Permalink
Define your own EventManager with doctrine.managers.[manager].event_m…
Browse files Browse the repository at this point in the history
…anager

Fixes #408
  • Loading branch information
eigan committed Nov 25, 2019
1 parent 09c17fb commit fa459b6
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
24 changes: 23 additions & 1 deletion src/EntityManagerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -133,7 +136,8 @@ public function create(array $settings = [])

$manager = EntityManager::create(
$connection,
$configuration
$configuration,
$eventManager
);

$manager = $this->decorateManager($settings, $manager);
Expand Down Expand Up @@ -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.
*
Expand Down
50 changes: 50 additions & 0 deletions tests/EntityManagerFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand Down Expand Up @@ -917,6 +963,10 @@ private function getDummyBaseInputConfig()
}
}

class FakeEventManager extends \Doctrine\Common\EventManager
{
}

class FakeConnection extends Connection
{
}
Expand Down

0 comments on commit fa459b6

Please sign in to comment.