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 a780880..3516e67 100644 --- a/Manager/RepositoryManager.php +++ b/Manager/RepositoryManager.php @@ -2,10 +2,10 @@ namespace FOQ\ElasticaBundle\Manager; +use Doctrine\Common\Annotations\Reader; use FOQ\ElasticaBundle\Finder\FinderInterface; use FOQ\ElasticaBundle\Repository; use RuntimeException; - /** * @author Richard Miller * @@ -16,6 +16,12 @@ class RepositoryManager implements RepositoryManagerInterface { protected $entities = array(); protected $repositories = array(); + protected $reader; + + public function __construct(Reader $reader) + { + $this->reader = $reader; + } public function addEntity($entityName, FinderInterface $finder, $repositoryName = null) { @@ -40,6 +46,8 @@ class RepositoryManager implements RepositoryManagerInterface throw new RuntimeException(sprintf('No search finder configured for %s', $entityName)); } + $this->setRepositoryFromAnnotation($entityName); + if (isset($this->entities[$entityName]['repositoryName'])) { $repositoryName = $this->entities[$entityName]['repositoryName']; @@ -56,4 +64,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/config.xml b/Resources/config/config.xml index e059a93..d5e2e7f 100644 --- a/Resources/config/config.xml +++ b/Resources/config/config.xml @@ -61,7 +61,9 @@ - + + + diff --git a/Resources/config/mongodb.xml b/Resources/config/mongodb.xml index 31e750e..099601e 100644 --- a/Resources/config/mongodb.xml +++ b/Resources/config/mongodb.xml @@ -26,6 +26,7 @@ + diff --git a/Tests/Manager/RepositoryManagerTest.php b/Tests/Manager/RepositoryManagerTest.php index 65641a1..484bf12 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 */ @@ -18,9 +20,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($finderMock); + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($readerMock); $manager->addEntity($entityName, $finderMock); $repository = $manager->getRepository($entityName); $this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository); @@ -32,9 +38,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($finderMock); + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($readerMock); $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\Manager\CustomRepository'); $repository = $manager->getRepository($entityName); $this->assertInstanceOf('FOQ\ElasticaBundle\Tests\Manager\CustomRepository', $repository); @@ -49,9 +59,13 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($finderMock); + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($readerMock); $manager->addEntity($entityName, $finderMock); $manager->getRepository('Missing Entity'); } @@ -65,10 +79,15 @@ class RepositoryManagerTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $entityName = 'Test Entity'; + $readerMock = $this->getMockBuilder('Doctrine\Common\Annotations\Reader') + ->disableOriginalConstructor() + ->getMock(); - $manager = new RepositoryManager($finderMock); + $entityName = 'FOQ\ElasticaBundle\Tests\Manager\Entity'; + + $manager = new RepositoryManager($readerMock); $manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\MissingRepository'); $manager->getRepository('Missing Entity'); } + }