Completed
Push — refactor-entity-validators ( 9b4b77...c6627d )
by Stefano
13:07 queued 10:18
created

DataMapperManager   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 87.5%

Importance

Changes 8
Bugs 3 Features 3
Metric Value
wmc 9
c 8
b 3
f 3
lcom 1
cbo 5
dl 0
loc 69
ccs 14
cts 16
cp 0.875
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A validatePlugin() 0 16 4
B getDataMapperForEntity() 0 24 3
1
<?php
2
/**
3
 * @author Stefano Torresi (http://stefanotorresi.it)
4
 * @license See the file LICENSE.txt for copying permission.
5
 * ************************************************
6
 */
7
8
namespace Thorr\Persistence\DataMapper\Manager;
9
10
use Thorr\Persistence\DataMapper\DataMapperInterface;
11
use Zend\ServiceManager\AbstractPluginManager;
12
use Zend\ServiceManager\ConfigInterface;
13
use Zend\ServiceManager\Exception;
14
15
/**
16
 * @method DataMapperInterface get($name)
17
 */
18
class DataMapperManager extends AbstractPluginManager implements DataMapperManagerInterface
19
{
20
    /**
21
     * @var array
22
     */
23
    protected $entityDataMapperMap;
24
25
    /**
26
     * {@inheritdoc}
27
     */
28 15
    public function __construct(ConfigInterface $configuration = null)
29
    {
30
        parent::__construct($configuration);
31
32 15
        if ($configuration instanceof DataMapperManagerConfig) {
33
            $this->entityDataMapperMap = $configuration->getEntityDataMapperMap();
34
        }
35
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 7
    public function validatePlugin($dataMapper)
41
    {
42 7
        if (! $dataMapper instanceof DataMapperInterface) {
43
            throw new Exception\RuntimeException(sprintf(
44 1
                'Invalid DataMapper type; expected %s, got %s',
45 1
                DataMapperInterface::class,
46
                (is_object($dataMapper) ? get_class($dataMapper) : gettype($dataMapper))
47
            ));
48
        }
49
50
        if (! class_exists($dataMapper->getEntityClass())) {
51
            throw new Exception\RuntimeException(sprintf(
52
                '%s::getEntityClass() must return a valid class', get_class($dataMapper)
53
            ));
54
        }
55 5
    }
56
57
    /**
58
     * @param string $entityClass
59
     *
60
     * @return DataMapperInterface
61
     */
62 7
    public function getDataMapperForEntity($entityClass)
63
    {
64 7
        if (! isset($this->entityDataMapperMap[$entityClass])) {
65
            throw new Exception\InvalidArgumentException(sprintf(
66 3
                "Could not find data mapper service name for entity class '%s'",
67
                $entityClass
68
            ));
69
        }
70
71 4
        $entityDMServiceName = $this->entityDataMapperMap[$entityClass];
72
73
        $dataMapper = $this->get($entityDMServiceName);
74
75
        if (! is_a($dataMapper->getEntityClass(), $entityClass, true)) {
76
            throw new Exception\RuntimeException(sprintf(
77 1
                '"%s" entity class mismatch: expected "%s", got "%s"',
78
                $entityDMServiceName,
79
                $entityClass,
80 1
                $dataMapper->getEntityClass()
81
            ));
82
        }
83
84 3
        return $dataMapper;
85
    }
86
}
87