Skip to content

Commit

Permalink
Merge pull request #199 from danizord/feature/config-entity-listener-…
Browse files Browse the repository at this point in the history
…resolver

Add 'entity_listener_resolver' config key
  • Loading branch information
Ocramius committed Feb 5, 2014
2 parents 31a0a0a + b79931a commit 1582e7d
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/DoctrineORMModule/Options/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace DoctrineORMModule\Options;

use DoctrineORMModule\Options\DBALConfiguration;
use Doctrine\ORM\Mapping\EntityListenerResolver;
use Doctrine\ORM\Mapping\NamingStrategy;
use Doctrine\ORM\Repository\RepositoryFactory;
use Zend\Stdlib\Exception\InvalidArgumentException;
Expand Down Expand Up @@ -169,6 +170,15 @@ class Configuration extends DBALConfiguration
*/
protected $classMetadataFactoryName;

/**
* Entity listener resolver or service name of the entity listener resolver
* to be set in ORM configuration (if any)
*
* @link http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#entity-listeners-resolver
* @var string|null|EntityListenerResolver
*/
protected $entityListenerResolver;

/**
* @param array $datetimeFunctions
* @return self
Expand Down Expand Up @@ -560,4 +570,36 @@ public function getClassMetadataFactoryName()
{
return $this->classMetadataFactoryName;
}

/**
* @param string|null|EntityListenerResolver $entityListenerResolver
* @return self
* @throws InvalidArgumentException When the provided entity listener resolver
* does not fit the expected type
*/
public function setEntityListenerResolver($entityListenerResolver)
{
if (null === $entityListenerResolver
|| $entityListenerResolver instanceof EntityListenerResolver
|| is_string($entityListenerResolver)
) {
$this->entityListenerResolver = $entityListenerResolver;

return $this;
}

throw new InvalidArgumentException(sprintf(
'entityListenerResolver must be either a string, a Doctrine\ORM\Mapping\EntityListenerResolver '
. 'instance or null, %s given',
is_object($entityListenerResolver) ? get_class($entityListenerResolver) : gettype($entityListenerResolver)
));
}

/**
* @return string|null|EntityListenerResolver
*/
public function getEntityListenerResolver()
{
return $this->entityListenerResolver;
}
}
9 changes: 9 additions & 0 deletions src/DoctrineORMModule/Service/ConfigurationFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

namespace DoctrineORMModule\Service;

use Doctrine\ORM\Mapping\EntityListenerResolver;
use DoctrineORMModule\Service\DBALConfigurationFactory as DoctrineConfigurationFactory;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\Exception\InvalidArgumentException;
Expand Down Expand Up @@ -92,6 +93,14 @@ public function createService(ServiceLocatorInterface $serviceLocator)
}
}

if ($entityListenerResolver = $options->getEntityListenerResolver()) {
if ($entityListenerResolver instanceof EntityListenerResolver) {
$config->setEntityListenerResolver($entityListenerResolver);
} else {
$config->setEntityListenerResolver($serviceLocator->get($entityListenerResolver));
}
}

$this->setupDBALConfiguration($serviceLocator, $config);

return $config;
Expand Down
19 changes: 19 additions & 0 deletions tests/DoctrineORMModuleTest/Options/ConfigurationOptionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,23 @@ public function testSetRepositoryFactory()
$this->setExpectedException('Zend\Stdlib\Exception\InvalidArgumentException');
$options->setRepositoryFactory(new \stdClass());
}

public function testSetGetEntityListenerResolver()
{
$options = new Configuration();

$options->setEntityListenerResolver(null);
$this->assertNull($options->getEntityListenerResolver());

$options->setEntityListenerResolver('test');
$this->assertSame('test', $options->getEntityListenerResolver());

$entityListenerResolver = $this->getMock('Doctrine\ORM\Mapping\EntityListenerResolver');

$options->setEntityListenerResolver($entityListenerResolver);
$this->assertSame($entityListenerResolver, $options->getEntityListenerResolver());

$this->setExpectedException('Zend\Stdlib\Exception\InvalidArgumentException');
$options->setEntityListenerResolver(new \stdClass());
}
}
60 changes: 60 additions & 0 deletions tests/DoctrineORMModuleTest/Service/ConfigurationFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,64 @@ public function testDefaultMetadatFactory()
$ormConfig = $factory->createService($this->serviceManager);
$this->assertEquals('Doctrine\ORM\Mapping\ClassMetadataFactory', $ormConfig->getClassMetadataFactoryName());
}

public function testWillInstantiateConfigWithoutEntityListenerResolverSetting()
{
$config = array(
'doctrine' => array(
'configuration' => array(
'test_default' => array(),
),
),
);

$this->serviceManager->setService('Config', $config);

$ormConfig = $this->factory->createService($this->serviceManager);

$this->assertInstanceOf('Doctrine\ORM\Mapping\EntityListenerResolver', $ormConfig->getEntityListenerResolver());
}

public function testWillInstantiateConfigWithEntityListenerResolverObject()
{
$entityListenerResolver = $this->getMock('Doctrine\ORM\Mapping\EntityListenerResolver');

$config = array(
'doctrine' => array(
'configuration' => array(
'test_default' => array(
'entity_listener_resolver' => $entityListenerResolver,
),
),
),
);

$this->serviceManager->setService('Config', $config);

$ormConfig = $this->factory->createService($this->serviceManager);

$this->assertSame($entityListenerResolver, $ormConfig->getEntityListenerResolver());
}

public function testWillInstantiateConfigWithEntityListenerResolverReference()
{
$entityListenerResolver = $this->getMock('Doctrine\ORM\Mapping\EntityListenerResolver');

$config = array(
'doctrine' => array(
'configuration' => array(
'test_default' => array(
'entity_listener_resolver' => 'test_entity_listener_resolver',
),
),
),
);

$this->serviceManager->setService('Config', $config);
$this->serviceManager->setService('test_entity_listener_resolver', $entityListenerResolver);

$ormConfig = $this->factory->createService($this->serviceManager);

$this->assertSame($entityListenerResolver, $ormConfig->getEntityListenerResolver());
}
}

0 comments on commit 1582e7d

Please sign in to comment.