From ba976e3a419b94ea41a88696983afa9f566df976 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Fri, 23 Dec 2011 15:29:01 +0000 Subject: [PATCH] Extracted the Doctine specific parts of the Repository Manager --- Doctrine/RepositoryManager.php | 63 ++++++++++ Manager/RepositoryManager.php | 51 +++------ Tests/Doctrine/RepositoryManagerTest.php | 139 +++++++++++++++++++++++ Tests/Manager/RepositoryManagerTest.php | 70 +----------- 4 files changed, 219 insertions(+), 104 deletions(-) create mode 100644 Doctrine/RepositoryManager.php create mode 100644 Tests/Doctrine/RepositoryManagerTest.php diff --git a/Doctrine/RepositoryManager.php b/Doctrine/RepositoryManager.php new file mode 100644 index 0000000..36eae0c --- /dev/null +++ b/Doctrine/RepositoryManager.php @@ -0,0 +1,63 @@ + + * + * Allows retrieval of basic or custom repository for mapped Doctrine + * entities/documents. + */ +class RepositoryManager extends BaseManager +{ + protected $entities = array(); + protected $repositories = array(); + protected $managerRegistry; + protected $reader; + + public function __construct(ManagerRegistry $managerRegistry, Reader $reader) + { + $this->managerRegistry = $managerRegistry; + $this->reader = $reader; + } + + /** + * Return repository for entity + * + * Returns custom repository if one specified otherwise + * returns a basic respository. + */ + public function getRepository($entityName) + { + $realEntityName = $entityName; + if (strpos($entityName, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $entityName); + $realEntityName = $this->managerRegistry->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + return parent::getRepository($realEntityName); + } + + protected function getCustomRepositoryName($realEntityName) + { + if (isset($this->entities[$realEntityName]['repositoryName'])) { + return $this->entities[$realEntityName]['repositoryName']; + } + + $refClass = new \ReflectionClass($realEntityName); + $annotation = $this->reader->getClassAnnotation($refClass, 'FOQ\\ElasticaBundle\\Configuration\\Search'); + if ($annotation) { + $this->entities[$realEntityName]['repositoryName'] + = $annotation->repositoryClass; + return $annotation->repositoryClass; + } + } + +} diff --git a/Manager/RepositoryManager.php b/Manager/RepositoryManager.php index 1e8a31a..6d45fc7 100644 --- a/Manager/RepositoryManager.php +++ b/Manager/RepositoryManager.php @@ -2,8 +2,6 @@ namespace FOQ\ElasticaBundle\Manager; -use Doctrine\Common\Annotations\Reader; -use Doctrine\Common\Persistence\ManagerRegistry; use FOQ\ElasticaBundle\Finder\FinderInterface; use FOQ\ElasticaBundle\Repository; use RuntimeException; @@ -17,14 +15,6 @@ class RepositoryManager implements RepositoryManagerInterface { protected $entities = array(); protected $repositories = array(); - protected $managerRegistry; - protected $reader; - - public function __construct(ManagerRegistry $managerRegistry, Reader $reader) - { - $this->managerRegistry = $managerRegistry; - $this->reader = $reader; - } public function addEntity($entityName, FinderInterface $finder, $repositoryName = null) { @@ -41,49 +31,34 @@ class RepositoryManager implements RepositoryManagerInterface */ public function getRepository($entityName) { - $realEntityName = $entityName; - if (strpos($entityName, ':') !== false) { - list($namespaceAlias, $simpleClassName) = explode(':', $entityName); - $realEntityName = $this->managerRegistry->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + if (isset($this->repositories[$entityName])) { + return $this->repositories[$entityName]; } - if (isset($this->repositories[$realEntityName])) { - return $this->repositories[$realEntityName]; + if (!isset($this->entities[$entityName])) { + throw new RuntimeException(sprintf('No search finder configured for %s', $entityName)); } - if (!isset($this->entities[$realEntityName])) { - throw new RuntimeException(sprintf('No search finder configured for %s', $realEntityName)); - } + $repositoryName = $this->getCustomRepositoryName($entityName); - $this->setRepositoryFromAnnotation($realEntityName); - - if (isset($this->entities[$realEntityName]['repositoryName'])) { - - $repositoryName = $this->entities[$realEntityName]['repositoryName']; + if ($repositoryName) { if (!class_exists($repositoryName)) { - throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $realEntityName)); + throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $entityName)); } - $repository = new $repositoryName($this->entities[$realEntityName]['finder']); - $this->repositories[$realEntityName] = $repository; + $repository = new $repositoryName($this->entities[$entityName]['finder']); + $this->repositories[$entityName] = $repository; return $repository; } - $repository = new Repository($this->entities[$realEntityName]['finder']); - $this->repositories[$realEntityName] = $repository; + $repository = new Repository($this->entities[$entityName]['finder']); + $this->repositories[$entityName] = $repository; return $repository; } - private function setRepositoryFromAnnotation($realEntityName) + protected function getCustomRepositoryName($realEntityName) { if (isset($this->entities[$realEntityName]['repositoryName'])) { - return; - } - - $refClass = new \ReflectionClass($realEntityName); - $annotation = $this->reader->getClassAnnotation($refClass, 'FOQ\\ElasticaBundle\\Configuration\\Search'); - if ($annotation) { - $this->entities[$realEntityName]['repositoryName'] - = $annotation->repositoryClass; + return $this->entities[$realEntityName]['repositoryName']; } } diff --git a/Tests/Doctrine/RepositoryManagerTest.php b/Tests/Doctrine/RepositoryManagerTest.php new file mode 100644 index 0000000..3ef80f4 --- /dev/null +++ b/Tests/Doctrine/RepositoryManagerTest.php @@ -0,0 +1,139 @@ + + */ +class RepositoryManagerTest extends \PHPUnit_Framework_TestCase +{ + + public function testThatGetRepositoryReturnsDefaultRepository() + { + $finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder') + ->disableOriginalConstructor() + ->getMock(); + + $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); + + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($registryMock, $readerMock); + $manager->addEntity($entityName, $finderMock); + $repository = $manager->getRepository($entityName); + $this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository); + } + + public function testThatGetRepositoryReturnsCustomRepository() + { + $finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder') + ->disableOriginalConstructor() + ->getMock(); + + $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); + + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($registryMock, $readerMock); + $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\Manager\CustomRepository'); + $repository = $manager->getRepository($entityName); + $this->assertInstanceOf('FOQ\ElasticaBundle\Tests\Manager\CustomRepository', $repository); + } + + /** + * @expectedException RuntimeException + */ + public function testThatGetRepositoryThrowsExceptionIfEntityNotConfigured() + { + $finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder') + ->disableOriginalConstructor() + ->getMock(); + + $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); + + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($registryMock, $readerMock); + $manager->addEntity($entityName, $finderMock); + $manager->getRepository('Missing Entity'); + } + + /** + * @expectedException RuntimeException + */ + public function testThatGetRepositoryThrowsExceptionIfCustomRepositoryNotFound() + { + $finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder') + ->disableOriginalConstructor() + ->getMock(); + + $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); + + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($registryMock, $readerMock); + $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\MissingRepository'); + $manager->getRepository('Missing Entity'); + } + + public function testThatGetRepositoryWorksWithShortEntityName() + { + $finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder') + ->disableOriginalConstructor() + ->getMock(); + + $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') + ->disableOriginalConstructor() + ->getMock(); + + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); + + $shortEntityName = 'TestBundle:Entity'; + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + $shortPath = 'TestBundle'; + $fullPath = 'FOQ\ElasticaBundle\Tests\Manager'; + + $registryMock->expects($this->once()) + ->method('getAliasNamespace') + ->with($this->equalTo($shortPath)) + ->will($this->returnValue($fullPath)); + + $manager = new RepositoryManager($registryMock, $readerMock); + $manager->addEntity($entityName, $finderMock); + $repository = $manager->getRepository($shortEntityName); + $this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository); + } + +} diff --git a/Tests/Manager/RepositoryManagerTest.php b/Tests/Manager/RepositoryManagerTest.php index fd2a39b..4b637bb 100644 --- a/Tests/Manager/RepositoryManagerTest.php +++ b/Tests/Manager/RepositoryManagerTest.php @@ -20,17 +20,9 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') - ->disableOriginalConstructor() - ->getMock(); - - $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') - ->disableOriginalConstructor() - ->getMock(); - $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; - $manager = new RepositoryManager($registryMock, $readerMock); + $manager = new RepositoryManager(); $manager->addEntity($entityName, $finderMock); $repository = $manager->getRepository($entityName); $this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository); @@ -42,17 +34,9 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') - ->disableOriginalConstructor() - ->getMock(); - - $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') - ->disableOriginalConstructor() - ->getMock(); - $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; - $manager = new RepositoryManager($registryMock, $readerMock); + $manager = new RepositoryManager(); $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\Manager\CustomRepository'); $repository = $manager->getRepository($entityName); $this->assertInstanceOf('FOQ\ElasticaBundle\Tests\Manager\CustomRepository', $repository); @@ -67,17 +51,9 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') - ->disableOriginalConstructor() - ->getMock(); - - $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') - ->disableOriginalConstructor() - ->getMock(); - $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; - $manager = new RepositoryManager($registryMock, $readerMock); + $manager = new RepositoryManager(); $manager->addEntity($entityName, $finderMock); $manager->getRepository('Missing Entity'); } @@ -91,49 +67,11 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') - ->disableOriginalConstructor() - ->getMock(); - - $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') - ->disableOriginalConstructor() - ->getMock(); - $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; - $manager = new RepositoryManager($registryMock, $readerMock); + $manager = new RepositoryManager(); $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\MissingRepository'); $manager->getRepository('Missing Entity'); } - public function testThatGetRepositoryWorksWithShortEntityName() - { - $finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder') - ->disableOriginalConstructor() - ->getMock(); - - $registryMock = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry') - ->disableOriginalConstructor() - ->getMock(); - - $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') - ->disableOriginalConstructor() - ->getMock(); - - $shortEntityName = 'TestBundle:Entity'; - $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; - $shortPath = 'TestBundle'; - $fullPath = 'FOQ\ElasticaBundle\Tests\Manager'; - - $registryMock->expects($this->once()) - ->method('getAliasNamespace') - ->with($this->equalTo($shortPath)) - ->will($this->returnValue($fullPath)); - - $manager = new RepositoryManager($registryMock, $readerMock); - $manager->addEntity($entityName, $finderMock); - $repository = $manager->getRepository($shortEntityName); - $this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository); - } - }