EventListenerPass::process()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 0
cts 10
cp 0
rs 9.7666
c 0
b 0
f 0
cc 4
nc 3
nop 1
crap 20
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
10
namespace GpsLab\Bundle\DomainEvent\DependencyInjection\Compiler;
11
12
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
13
use Symfony\Component\DependencyInjection\ContainerBuilder;
14
use Symfony\Component\DependencyInjection\Definition;
15
16
class EventListenerPass implements CompilerPassInterface
17
{
18
    /**
19
     * @param ContainerBuilder $container
20
     */
21
    public function process(ContainerBuilder $container)
22
    {
23
        if (!$container->has('domain_event.locator')) {
24
            return;
25
        }
26
27
        $current_locator = $container->findDefinition('domain_event.locator');
28
        $symfony_locator = $container->findDefinition('domain_event.locator.symfony');
29
        $container_locator = $container->findDefinition('domain_event.locator.container');
30
31
        if ($current_locator === $symfony_locator || $current_locator === $container_locator) {
32
            $this->registerListeners($container, $current_locator);
33
            $this->registerSubscribers($container, $current_locator);
34
        }
35
    }
36
37
    /**
38
     * @param ContainerBuilder $container
39
     * @param Definition       $current_locator
40
     */
41
    private function registerListeners(ContainerBuilder $container, Definition $current_locator)
42
    {
43
        foreach ($container->findTaggedServiceIds('domain_event.listener') as $id => $attributes) {
44
            foreach ($attributes as $attribute) {
45
                $method = !empty($attribute['method']) ? $attribute['method'] : '__invoke';
46
                $current_locator->addMethodCall('registerService', [$attribute['event'], $id, $method]);
47
            }
48
        }
49
    }
50
51
    /**
52
     * @param ContainerBuilder $container
53
     * @param Definition       $current_locator
54
     */
55
    private function registerSubscribers(ContainerBuilder $container, Definition $current_locator)
56
    {
57
        foreach ($container->findTaggedServiceIds('domain_event.subscriber') as $id => $attributes) {
58
            $subscriber = $container->findDefinition($id);
59
            $current_locator->addMethodCall('registerSubscriberService', [$id, $subscriber->getClass()]);
60
        }
61
    }
62
}
63