Passed
Push — master ( 8ad776...1c534f )
by Artem
01:32
created

AbstractFactory::entityExists()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
namespace Prozorov\DataVerification\Factories;
4
5
use Prozorov\DataVerification\Exceptions\{ConfigurationException, FactoryException};
6
use Webmozart\Assert\Assert;
7
8
abstract class AbstractFactory
9
{
10
    /**
11
     * @var string $allowedType
12
     */
13
    protected $allowedType;
14
15
    /**
16
     * @var array $config
17
     */
18
    protected $config = [];
19
20 12
    public function __construct(array $config)
21
    {
22 12
        $this->loadConfig($config);
23 12
    }
24
25
    /**
26
     * loadConfig.
27
     *
28
     * @access	protected
29
     * @param	array	$config	
30
     * @return	void
31
     */
32 12
    protected function loadConfig(array $config): void
33
    {
34 12
        foreach ($config as $code => $class) {
35 12
            if (!class_exists($class)) {
36
                throw new FactoryException('Фабрика не сможет создать такой объект: '.$class);
37
            }
38
        }
39
40 12
        $this->config = $config;
41 12
    }
42
43
    /**
44
     * make.
45
     *
46
     * @access	public
47
     * @param	string	$code	
48
     * @return	mixed
49
     */
50 4
    public function make(string $code)
51
    {
52 4
        if (empty($this->config)) {
53
            throw new ConfigurationException('Фабрика не инициализирована');
54
        }
55
56 4
        if (! $this->entityExists($code)) {
57 1
            throw new FactoryException('Фабрика не может сделать такую сущность');
58
        }
59
60 3
        $resolved = new $this->config[$code];
61
62 3
        Assert::isInstanceOf($resolved, $this->allowedType);
63
64 3
        return $resolved;
65
    }
66
67
    /**
68
     * entityExists.
69
     *
70
     * @access	public
71
     * @param	string	$code	
72
     * @return	bool
73
     */
74 4
    public function entityExists(string $code): bool
75
    {
76 4
        return array_key_exists($code, $this->config);
77
    }
78
}
79