load()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 10
cts 10
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 9
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Gendoria\CommandQueueDoctrineDriverBundle\DependencyInjection;
4
5
use Gendoria\CommandQueueBundle\DependencyInjection\Pass\WorkerRunnersPass;
6
use Symfony\Component\Config\FileLocator;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
9
use Symfony\Component\DependencyInjection\Loader;
10
use Symfony\Component\DependencyInjection\Reference;
11
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
12
13
/**
14
 * This is the class that loads and manages your bundle configuration.
15
 *
16
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
17
 */
18
class GendoriaCommandQueueDoctrineDriverExtension extends Extension
19
{
20
    /**
21
     * Get extension alias.
22
     *
23
     * @return string
24
     */
25 1
    public function getAlias()
26
    {
27 1
        return 'gendoria_command_queue_rabbit_mq_driver';
28
    }
29
30
    /**
31
     * Load extension.
32
     *
33
     * @param array            $configs
34
     * @param ContainerBuilder $container
35
     */
36 1
    public function load(array $configs, ContainerBuilder $container)
37
    {
38 1
        $configuration = new Configuration($this->getAlias());
39 1
        $config = $this->processConfiguration($configuration, $configs);
40
41 1
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
42 1
        $loader->load('services.yml');
43
44 1
        $this->loadDrivers($config, $container);
45 1
        $container->removeDefinition('gendoria_command_queue_doctrine_driver.send_driver');
46 1
        $container->removeDefinition('gendoria_command_queue_doctrine_driver.worker');
47 1
        $container->removeDefinition('gendoria_command_queue_doctrine_driver.worker_runner');
48 1
    }
49
    
50 1
    private function loadDrivers(array $config, ContainerBuilder $container)
51
    {
52 1
        foreach ($config['drivers'] as $driverId => $driver) {
53 1
            $serializer = substr($driver['serializer'], 1);
54 1
            $connectionService = sprintf('doctrine.dbal.%s_connection', $driver['connection']);
55
            
56 1
            $this->prepareSendDriver($container, $driverId, $driver, $connectionService, $serializer);
57 1
            $this->prepareNewWorker($container, $driverId, $driver, $serializer);
58 1
            $this->prepareNewWorkerRunner($container, $driverId, $driver, $connectionService);
59 1
        }
60 1
        $container->setParameter('gendoria_command_queue_doctrine_driver.drivers', $config['drivers']);
61 1
    }
62
    
63 1
    private function prepareSendDriver(ContainerBuilder $container, $driverId, $driver, $connectionService, $serializer)
64
    {
65 1
        $newDriver = clone $container->getDefinition('gendoria_command_queue_doctrine_driver.send_driver');
66 1
        $newDriver->replaceArgument(0, new Reference($serializer));
67 1
        $newDriver->replaceArgument(1, new Reference($connectionService));
68 1
        $newDriver->replaceArgument(2, $driver['table_name']);
69 1
        $newDriver->replaceArgument(3, $driverId);
70 1
        $container->setDefinition('gendoria_command_queue_doctrine_driver.driver.'.$driverId, $newDriver);
71 1
    }
72
    
73 1
    private function prepareNewWorker(ContainerBuilder $container, $driverId, $driver, $serializer)
74
    {
75 1
        $newWorker = clone $container->getDefinition('gendoria_command_queue_doctrine_driver.worker');
76 1
        $newWorker->replaceArgument(2, new Reference($serializer));
77 1
        $newWorker->replaceArgument(3, $driver['table_name']);
78 1
        $newWorker->replaceArgument(4, $driverId);
79 1
        $container->setDefinition('gendoria_command_queue_doctrine_driver.worker.'.$driverId, $newWorker);
80 1
    }
81
    
82 1
    private function prepareNewWorkerRunner(ContainerBuilder $container, $driverId, $driver, $connectionService)
83
    {
84 1
        $newRunner = clone $container->getDefinition('gendoria_command_queue_doctrine_driver.worker_runner');
85 1
        $newRunner->replaceArgument(0, new Reference('gendoria_command_queue_doctrine_driver.worker.'.$driverId));
86 1
        $newRunner->replaceArgument(1, new Reference($connectionService));
87 1
        $newRunner->replaceArgument(2, $driver['table_name']);
88 1
        $newRunner->replaceArgument(3, $driverId);
89 1
        $newRunner->addTag(WorkerRunnersPass::WORKER_RUNNER_TAG, array('name' => 'doctrine.'.$driverId, 'options' => json_encode($driver)));
90 1
        $container->setDefinition('gendoria_command_queue_doctrine_driver.worker_runner.'.$driverId, $newRunner);
91 1
    }    
92
}
93