Completed
Push — master ( e4d3d5...ce2180 )
by Tomasz
03:41
created

loadDrivers()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 9
cts 9
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 7
nc 2
nop 2
crap 2
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
    }
61
    
62 1
    private function prepareSendDriver(ContainerBuilder $container, $driverId, $driver, $connectionService, $serializer)
63
    {
64 1
        $newDriver = clone $container->getDefinition('gendoria_command_queue_doctrine_driver.send_driver');
65 1
        $newDriver->replaceArgument(0, new Reference($serializer));
66 1
        $newDriver->replaceArgument(1, new Reference($connectionService));
67 1
        $newDriver->replaceArgument(2, $driver['table_name']);
68 1
        $newDriver->replaceArgument(3, $driverId);
69 1
        $container->setDefinition('gendoria_command_queue_doctrine_driver.driver.'.$driverId, $newDriver);
70 1
    }
71
    
72 1
    private function prepareNewWorker(ContainerBuilder $container, $driverId, $driver, $serializer)
73
    {
74 1
        $newWorker = clone $container->getDefinition('gendoria_command_queue_doctrine_driver.worker');
75 1
        $newWorker->replaceArgument(2, new Reference($serializer));
76 1
        $newWorker->replaceArgument(3, $driver['table_name']);
77 1
        $newWorker->replaceArgument(4, $driverId);
78 1
        $container->setDefinition('gendoria_command_queue_doctrine_driver.worker.'.$driverId, $newWorker);
79 1
    }
80
    
81 1
    private function prepareNewWorkerRunner(ContainerBuilder $container, $driverId, $driver, $connectionService)
82
    {
83 1
        $newRunner = clone $container->getDefinition('gendoria_command_queue_doctrine_driver.worker_runner');
84 1
        $newRunner->replaceArgument(0, new Reference('gendoria_command_queue_doctrine_driver.worker.'.$driverId));
85 1
        $newRunner->replaceArgument(1, new Reference($connectionService));
86 1
        $newRunner->replaceArgument(2, $driver['table_name']);
87 1
        $newRunner->replaceArgument(3, $driverId);
88 1
        $newRunner->addTag(WorkerRunnersPass::WORKER_RUNNER_TAG, array('name' => 'doctrine.'.$driverId, 'options' => json_encode($driver)));
89 1
        $container->setDefinition('gendoria_command_queue_doctrine_driver.worker_runner.'.$driverId, $newRunner);
90 1
    }    
91
}
92