diff --git a/Configuration/Search.php b/Configuration/Search.php new file mode 100644 index 0000000..d3cb624 --- /dev/null +++ b/Configuration/Search.php @@ -0,0 +1,18 @@ + + * @Annotation + * @Target("CLASS") + */ +class Search +{ + + /** @var string */ + public $repositoryClass; + +} diff --git a/Manager/RepositoryManager.php b/Manager/RepositoryManager.php index d9fd4e1..1e8a31a 100644 --- a/Manager/RepositoryManager.php +++ b/Manager/RepositoryManager.php @@ -2,11 +2,11 @@ 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; - /** * @author Richard Miller * @@ -18,10 +18,12 @@ class RepositoryManager implements RepositoryManagerInterface protected $entities = array(); protected $repositories = array(); protected $managerRegistry; + protected $reader; - public function __construct(ManagerRegistry $managerRegistry) + public function __construct(ManagerRegistry $managerRegistry, Reader $reader) { $this->managerRegistry = $managerRegistry; + $this->reader = $reader; } public function addEntity($entityName, FinderInterface $finder, $repositoryName = null) @@ -53,6 +55,8 @@ class RepositoryManager implements RepositoryManagerInterface throw new RuntimeException(sprintf('No search finder configured for %s', $realEntityName)); } + $this->setRepositoryFromAnnotation($realEntityName); + if (isset($this->entities[$realEntityName]['repositoryName'])) { $repositoryName = $this->entities[$realEntityName]['repositoryName']; @@ -69,4 +73,18 @@ class RepositoryManager implements RepositoryManagerInterface return $repository; } + private function setRepositoryFromAnnotation($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; + } + } + } diff --git a/Resources/config/mongodb.xml b/Resources/config/mongodb.xml index 5bb5fc0..49b86f6 100644 --- a/Resources/config/mongodb.xml +++ b/Resources/config/mongodb.xml @@ -29,6 +29,7 @@ + diff --git a/Resources/config/orm.xml b/Resources/config/orm.xml index fe945db..6159fa6 100644 --- a/Resources/config/orm.xml +++ b/Resources/config/orm.xml @@ -29,6 +29,7 @@ + diff --git a/Tests/Manager/RepositoryManagerTest.php b/Tests/Manager/RepositoryManagerTest.php index c0cc2fe..fd2a39b 100644 --- a/Tests/Manager/RepositoryManagerTest.php +++ b/Tests/Manager/RepositoryManagerTest.php @@ -6,6 +6,8 @@ use FOQ\ElasticaBundle\Manager\RepositoryManager; class CustomRepository{} +class Entity{} + /** * @author Richard Miller */ @@ -22,9 +24,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($registryMock); + $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); @@ -40,9 +46,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($registryMock); + $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); @@ -61,9 +71,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($registryMock); + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($registryMock, $readerMock); $manager->addEntity($entityName, $finderMock); $manager->getRepository('Missing Entity'); } @@ -81,9 +95,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($registryMock); + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($registryMock, $readerMock); $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\MissingRepository'); $manager->getRepository('Missing Entity'); } @@ -98,17 +116,21 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $shortEntityName = 'TestBundle:TestEntity'; - $entityName = 'TestBundle\Full\Path\To\TestEntity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); + + $shortEntityName = 'TestBundle:Entity'; + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; $shortPath = 'TestBundle'; - $fullPath = 'TestBundle\Full\Path\To'; + $fullPath = 'FOQ\ElasticaBundle\Tests\Manager'; $registryMock->expects($this->once()) ->method('getAliasNamespace') ->with($this->equalTo($shortPath)) ->will($this->returnValue($fullPath)); - $manager = new RepositoryManager($registryMock); + $manager = new RepositoryManager($registryMock, $readerMock); $manager->addEntity($entityName, $finderMock); $repository = $manager->getRepository($shortEntityName); $this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository);