Completed
Push — master ( 8d00b2...bd4300 )
by Karel
06:12
created

RepositoryManager::createRepository()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
ccs 1
cts 1
cp 1
rs 9.4285
cc 2
eloc 4
nc 2
nop 1
crap 2
1
<?php
2
3
namespace FOS\ElasticaBundle\Manager;
4
5
use Doctrine\Common\Annotations\Reader;
6
use FOS\ElasticaBundle\Finder\FinderInterface;
7
use FOS\ElasticaBundle\Repository;
8
use RuntimeException;
9
10
/**
11
 * @author Richard Miller <[email protected]>
12
 *
13
 * Allows retrieval of basic or custom repository for mapped Doctrine
14
 * entities/documents.
15
 */
16
class RepositoryManager implements RepositoryManagerInterface
17
{
18
    /**
19
     * @var array
20
     */
21 12
    private $types;
22
23 12
    /**
24 12
     * @var Repository[]
25
     */
26 12
    private $repositories;
27
28 12
    public function __construct()
29 12
    {
30 12
        $this->types = [];
31 12
        $this->repositories = [];
32
    }
33
34
    public function addType($indexTypeName, FinderInterface $finder, $repositoryName = null)
35
    {
36
        $this->types[$indexTypeName] = [
37
            'finder' => $finder,
38
            'repositoryName' => $repositoryName
39 12
        ];
40
    }
41 12
42 1
    /**
43
     * Return repository for entity.
44
     *
45 12
     * Returns custom repository if one specified otherwise
46 4
     * returns a basic repository.
47
     *
48
     * @param string $typeName
49 8
     *
50 7
     * @return Repository
51
     */
52 7
    public function getRepository($typeName)
53
    {
54
        if (isset($this->repositories[$typeName])) {
55
            return $this->repositories[$typeName];
56
        }
57
58
        if (!isset($this->types[$typeName])) {
59
            throw new RuntimeException(sprintf('No search finder configured for %s', $typeName));
60 8
        }
61
62 8
        $repository = $this->createRepository($typeName);
63 4
        $this->repositories[$typeName] = $repository;
64
65
        return $repository;
66 4
    }
67 4
68 4
    /**
69 1
     * @param $typeName
70 1
     *
71
     * @return string
72 1
     */
73
    protected function getRepositoryName($typeName)
74
    {
75 3
        if (isset($this->types[$typeName]['repositoryName'])) {
76
            return $this->types[$typeName]['repositoryName'];
77
        }
78
79
        return 'FOS\ElasticaBundle\Repository';
80
    }
81
82
    /**
83 8
     * @param $typeName
84
     *
85 8
     * @return mixed
86 1
     */
87
    private function createRepository($typeName)
88
    {
89 7
        if (!class_exists($repositoryName = $this->getRepositoryName($typeName))) {
90
            throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $typeName));
91
        }
92
93
        return new $repositoryName($this->types[$typeName]['finder']);
94
    }
95
}
96