Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Repository Manager refactoring #1119

Merged
merged 2 commits into from
Aug 23, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 9 additions & 4 deletions DependencyInjection/FOSElasticaExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -617,13 +617,18 @@ private function loadTypeFinder(array $typeConfig, ContainerBuilder $container,
$container->setDefinition($finderId, $finderDef);
}

$managerId = sprintf('fos_elastica.manager.%s', $typeConfig['driver']);
$managerDef = $container->getDefinition($managerId);
$arguments = array( $typeConfig['model'], new Reference($finderId));
$indexTypeName = "$indexName/$typeName";
$arguments = [$indexTypeName, new Reference($finderId)];
if (isset($typeConfig['repository'])) {
$arguments[] = $typeConfig['repository'];
}
$managerDef->addMethodCall('addEntity', $arguments);

$container->getDefinition('fos_elastica.repository_manager')
->addMethodCall('addType', $arguments);

$managerId = sprintf('fos_elastica.manager.%s', $typeConfig['driver']);
$container->getDefinition($managerId)
->addMethodCall('addEntity', [$typeConfig['model'], $indexTypeName]);

return $finderId;
}
Expand Down
36 changes: 31 additions & 5 deletions Doctrine/RepositoryManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@

use Doctrine\Common\Annotations\Reader;
use Doctrine\Common\Persistence\ManagerRegistry;
use FOS\ElasticaBundle\Finder\FinderInterface;
use FOS\ElasticaBundle\Manager\RepositoryManager as BaseManager;
use FOS\ElasticaBundle\Manager\RepositoryManagerInterface;

/**
* @author Richard Miller <info@limethinking.co.uk>
*
* Allows retrieval of basic or custom repository for mapped Doctrine
* entities/documents.
*
* @deprecated
*/
class RepositoryManager extends BaseManager
class RepositoryManager implements RepositoryManagerInterface
{
/** @var array */
protected $entities = array();
Expand All @@ -23,14 +27,32 @@ class RepositoryManager extends BaseManager
/** @var ManagerRegistry */
protected $managerRegistry;

/**
* @var RepositoryManagerInterface
*/
private $repositoryManager;

/**
* @param ManagerRegistry $managerRegistry
* @param Reader $reader
* @param RepositoryManagerInterface $repositoryManager
*/
public function __construct(ManagerRegistry $managerRegistry, Reader $reader)
public function __construct(ManagerRegistry $managerRegistry, RepositoryManagerInterface $repositoryManager)
{
$this->managerRegistry = $managerRegistry;
parent::__construct($reader);
$this->repositoryManager = $repositoryManager;
}

/**
* @inheritDoc
*/
public function addType($indexTypeName, FinderInterface $finder, $repositoryName = null)
{
throw new \LogicException(__METHOD__.' should not be called. Call addType on the main repository manager');
}

public function addEntity($entityName, $indexTypeName)
{
$this->entities[$entityName] = $indexTypeName;
}

/**
Expand All @@ -46,6 +68,10 @@ public function getRepository($entityName)
$realEntityName = $this->managerRegistry->getAliasNamespace($namespaceAlias).'\\'.$simpleClassName;
}

return parent::getRepository($realEntityName);
if (isset($this->entities[$realEntityName])) {
$realEntityName = $this->entities[$realEntityName];
}

return $this->repositoryManager->getRepository($realEntityName);
}
}
72 changes: 38 additions & 34 deletions Manager/RepositoryManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Doctrine\Common\Annotations\Reader;
use FOS\ElasticaBundle\Finder\FinderInterface;
use FOS\ElasticaBundle\Repository;
use RuntimeException;

/**
Expand All @@ -14,78 +15,81 @@
*/
class RepositoryManager implements RepositoryManagerInterface
{
protected $entities = array();
protected $repositories = array();
protected $reader;
/**
* @var array
*/
private $types;

/**
* @var Repository[]
*/
private $repositories;

public function __construct(Reader $reader)
public function __construct()
{
$this->reader = $reader;
$this->types = [];
$this->repositories = [];
}

public function addEntity($entityName, FinderInterface $finder, $repositoryName = null)
public function addType($indexTypeName, FinderInterface $finder, $repositoryName = null)
{
$this->entities[$entityName] = array();
$this->entities[$entityName]['finder'] = $finder;
$this->entities[$entityName]['repositoryName'] = $repositoryName;
$this->types[$indexTypeName] = [
'finder' => $finder,
'repositoryName' => $repositoryName
];
}

/**
* Return repository for entity.
*
* Returns custom repository if one specified otherwise
* returns a basic repository.
*
* @param string $typeName
*
* @return Repository
*/
public function getRepository($entityName)
public function getRepository($typeName)
{
if (isset($this->repositories[$entityName])) {
return $this->repositories[$entityName];
if (isset($this->repositories[$typeName])) {
return $this->repositories[$typeName];
}

if (!isset($this->entities[$entityName])) {
throw new RuntimeException(sprintf('No search finder configured for %s', $entityName));
if (!isset($this->types[$typeName])) {
throw new RuntimeException(sprintf('No search finder configured for %s', $typeName));
}

$repository = $this->createRepository($entityName);
$this->repositories[$entityName] = $repository;
$repository = $this->createRepository($typeName);
$this->repositories[$typeName] = $repository;

return $repository;
}

/**
* @param string $entityName
* @param $typeName
*
* @return string
*/
protected function getRepositoryName($entityName)
protected function getRepositoryName($typeName)
{
if (isset($this->entities[$entityName]['repositoryName'])) {
return $this->entities[$entityName]['repositoryName'];
}

$refClass = new \ReflectionClass($entityName);
$annotation = $this->reader->getClassAnnotation($refClass, 'FOS\\ElasticaBundle\\Annotation\\Search');
if ($annotation) {
$this->entities[$entityName]['repositoryName']
= $annotation->repositoryClass;

return $annotation->repositoryClass;
if (isset($this->types[$typeName]['repositoryName'])) {
return $this->types[$typeName]['repositoryName'];
}

return 'FOS\ElasticaBundle\Repository';
}

/**
* @param string $entityName
* @param $typeName
*
* @return mixed
*/
private function createRepository($entityName)
private function createRepository($typeName)
{
if (!class_exists($repositoryName = $this->getRepositoryName($entityName))) {
throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $entityName));
if (!class_exists($repositoryName = $this->getRepositoryName($typeName))) {
throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $typeName));
}

return new $repositoryName($this->entities[$entityName]['finder']);
return new $repositoryName($this->types[$typeName]['finder']);
}
}
13 changes: 8 additions & 5 deletions Manager/RepositoryManagerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace FOS\ElasticaBundle\Manager;

use FOS\ElasticaBundle\Finder\FinderInterface;
use FOS\ElasticaBundle\Repository;

/**
* @author Richard Miller <info@limethinking.co.uk>
Expand All @@ -13,22 +14,24 @@
interface RepositoryManagerInterface
{
/**
* Adds entity name and its finder.
* Adds type name and its finder.
* Custom repository class name can also be added.
*
* @param string $entityName
* @param string $indexTypeName The type name in "index/type" format
* @param $finder
* @param string $repositoryName
*/
public function addEntity($entityName, FinderInterface $finder, $repositoryName = null);
public function addType($indexTypeName, FinderInterface $finder, $repositoryName = null);

/**
* Return repository for entity.
*
* Returns custom repository if one specified otherwise
* returns a basic repository.
*
* @param string $entityName
* @param $typeName
*
* @return Repository
*/
public function getRepository($entityName);
public function getRepository($typeName);
}
3 changes: 3 additions & 0 deletions Resources/config/index.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@
<parameter key="fos_elastica.index_manager.class">FOS\ElasticaBundle\Index\IndexManager</parameter>
<parameter key="fos_elastica.resetter.class">FOS\ElasticaBundle\Index\Resetter</parameter>
<parameter key="fos_elastica.type.class">Elastica\Type</parameter>
<parameter key="fos_elastica.repository_manager.class">FOS\ElasticaBundle\Manager\RepositoryManager</parameter>
</parameters>

<services>
<service id="fos_elastica.repository_manager" class="%fos_elastica.repository_manager.class%" />

<service id="fos_elastica.alias_processor" class="%fos_elastica.alias_processor.class%" />

<service id="fos_elastica.indexable" class="%fos_elastica.indexable.class%">
Expand Down
2 changes: 1 addition & 1 deletion Resources/config/orm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@

<service id="fos_elastica.manager.orm" class="%fos_elastica.manager.orm.class%">
<argument type="service" id="doctrine" />
<argument type="service" id="annotation_reader" />
<argument type="service" id="fos_elastica.repository_manager" />
</service>
</services>
</container>