Completed
Push — master ( caead5...f1379b )
by Peter
06:59
created

GpsLabDomainEventExtension::getLocatorRealName()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 0
cts 7
cp 0
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 1
crap 6
1
<?php
2
/**
3
 * GpsLab component.
4
 *
5
 * @author    Peter Gribanov <[email protected]>
6
 * @copyright Copyright (c) 2016, Peter Gribanov
7
 * @license   http://opensource.org/licenses/MIT
8
 */
9
namespace GpsLab\Bundle\DomainEvent\DependencyInjection;
10
11
use Doctrine\ORM\Events;
12
use Symfony\Component\Config\FileLocator;
13
use Symfony\Component\DependencyInjection\ContainerBuilder;
14
use Symfony\Component\DependencyInjection\Loader;
15
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
16
17
class GpsLabDomainEventExtension extends Extension
18
{
19
    /**
20
     * @param array $configs
21
     * @param ContainerBuilder $container
22
     */
23
    public function load(array $configs, ContainerBuilder $container)
24
    {
25
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
26
        $loader->load('bus.yml');
27
        $loader->load('locator.yml');
28
        $loader->load('name_resolver.yml');
29
        $loader->load('subscriber.yml');
30
31
        $config = $this->processConfiguration(new Configuration(), $configs);
32
33
        $config = $this->mergeDefaultConfig((array)$config);
34
35
        $container->setAlias('domain_event.locator', $this->getLocatorRealName($config['locator']));
36
        $container->setAlias('domain_event.name_resolver', $config['name_resolver']);
37
38
        $container->setParameter('domain_event.doctrine.handle_events', $config['doctrine']['handle_events']);
39
        $container->setParameter('domain_event.doctrine.connections', $config['doctrine']['connections']);
40
    }
41
42
    /**
43
     * @param string $name
44
     *
45
     * @return string
46
     */
47
    protected function getLocatorRealName($name)
48
    {
49
        if (in_array($name, ['voter', 'named_event'])) {
50
            return 'domain_event.locator.'.$name;
51
        }
52
53
        return $name;
54
    }
55
56
    /**
57
     * @param string $name
58
     *
59
     * @return string
60
     */
61
    protected function getNameResolverRealName($name)
62
    {
63
        if (in_array($name, ['event_class', 'event_class_last_part', 'named_event'])) {
64
            return 'domain_event.name_resolver.'.$name;
65
        }
66
67
        return $name;
68
    }
69
70
    /**
71
     * Default config:
72
     *
73
     * gpslab_domain_event:
74
     *     locator: 'named_event'
75
     *     name_resolver: 'event_class'
76
     *     doctrine:
77
     *         handle_events:
78
     *             - 'preFlush'
79
     *         connections:
80
     *             - 'default'
81
     *
82
     * @param array $config
83
     *
84
     * @return array
85
     */
86
    protected function mergeDefaultConfig(array $config)
87
    {
88
        $config = array_merge([
89
            'locator' => 'named_event',
90
            'name_resolver' => 'event_class',
91
            'doctrine' => [],
92
        ], $config);
93
94
        $config['doctrine'] = array_merge([
95
            'handle_events' => [],
96
            'connections' => [],
97
        ], (array)$config['doctrine']);
98
99
        $config['doctrine']['handle_events'] = array_merge([
100
            Events::preFlush,
101
        ], (array)$config['doctrine'],['handle_events']);
102
103
        $config['doctrine']['connections'] = array_merge([
104
            'default',
105
        ], (array)$config['doctrine'],['connections']);
106
107
        return $config;
108
    }
109
}
110