Completed
Push — master ( abbc89...6b01a6 )
by Peter
03:39
created

mergeBackwardCompatibilityConfig()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 5

Importance

Changes 4
Bugs 0 Features 2
Metric Value
c 4
b 0
f 2
dl 0
loc 16
ccs 12
cts 12
cp 1
rs 8.8571
cc 5
eloc 8
nc 6
nop 2
crap 5
1
<?php
2
/**
3
 * AnimeDb package.
4
 *
5
 * @author    Peter Gribanov <[email protected]>
6
 * @copyright Copyright (c) 2014, Peter Gribanov
7
 * @license   http://opensource.org/licenses/MIT
8
 */
9
namespace AnimeDb\Bundle\CacheTimeKeeperBundle\DependencyInjection;
10
11
use Symfony\Component\DependencyInjection\ContainerBuilder;
12
use Symfony\Component\Config\FileLocator;
13
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
14
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
15
16
class AnimeDbCacheTimeKeeperExtension extends Extension
17
{
18
    /**
19
     * @param array $configs
20
     * @param ContainerBuilder $container
21
     */
22 2
    public function load(array $configs, ContainerBuilder $container)
23
    {
24 2
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
25 2
        $loader->load('parameters.yml');
26 2
        $loader->load('services.yml');
27
28 2
        $configuration = new Configuration(
29 2
            $container->getParameter('cache_time_keeper.driver.shmop.salt'),
30 2
            $container->getParameter('cache_time_keeper.driver.file.path')
31 2
        );
32 2
        $config = $this->processConfiguration($configuration, $configs);
33
34 2
        $config = $this->mergeBackwardCompatibilityConfig($config, $container);
35 2
        $config = $this->mergeDefaultConfig($config, $container);
36
37
        // configure drivers
38
        $container
39 2
            ->getDefinition('cache_time_keeper.driver.shmop')
40 2
            ->replaceArgument(0, $config['drivers']['shmop']['salt']);
41
        $container
42 2
            ->getDefinition('cache_time_keeper.driver.file')
43 2
            ->replaceArgument(0, $config['drivers']['file']['path']);
44
        $container
45 2
            ->getDefinition('cache_time_keeper.driver.memcache')
46 2
            ->replaceArgument(1, $config['drivers']['memcache']['prefix']);
47
        $container
48 2
            ->getDefinition('cache_time_keeper.listener.console')
49 2
            ->replaceArgument(1, $config['track']['clear_cache']);
50
51
        // configure memcache
52
        $memcache = $container
53 2
            ->getDefinition('cache_time_keeper.memcache')
54 2
            ->replaceArgument(0, $config['drivers']['memcache']['persistent_id']);
55 2
        foreach ($config['drivers']['memcache']['hosts'] as $host) {
56 1
            $memcache->addMethodCall('addServer', $host);
57 2
        }
58
59
        // add service aliases
60 2
        $container->setAlias(
61 2
            'cache_time_keeper.driver',
62 2
            $this->getRealServiceName($config['use_driver'])
63 2
        );
64 2
        $container->setAlias(
65 2
            'cache_time_keeper.driver.multi.fast',
66 2
            $this->getRealServiceName($config['drivers']['multi']['fast'])
67 2
        );
68 2
        $container->setAlias(
69 2
            'cache_time_keeper.driver.multi.slow',
70 2
            $this->getRealServiceName($config['drivers']['multi']['slow'])
71 2
        );
72 2
    }
73
74
    /**
75
     * @param string $name
76
     *
77
     * @return string
78
     */
79 2
    protected function getRealServiceName($name)
80
    {
81 2
        if (strpos($name, '.') === false) {
82 1
            return 'cache_time_keeper.driver.'.$name;
83
        }
84
85 1
        return $name;
86
    }
87
88
    /**
89
     * @param array $config
90
     * @param ContainerBuilder $container
91
     *
92
     * @return array
93
     */
94 2
    protected function mergeBackwardCompatibilityConfig(array $config, ContainerBuilder $container)
95
    {
96 2
        if ($container->hasParameter('cache_time_keeper.driver')) {
97 1
            $config['use_driver'] = $container->getParameter('cache_time_keeper.driver');
98 1
        }
99
100 2
        foreach (['fast', 'slow'] as $item) {
101 2
            if (empty($config['drivers']['multi'][$item]) &&
102 1
                $container->hasParameter('cache_time_keeper.driver.multi.'.$item)
103 2
            ) {
104 1
                $config['drivers']['multi'][$item] = $container->getParameter('cache_time_keeper.driver.multi.'.$item);
105 1
            }
106 2
        }
107
108 2
        return $config;
109
    }
110
111
    /**
112
     * @param array $config
113
     * @param ContainerBuilder $container
114
     *
115
     * @return array
116
     */
117 2
    protected function mergeDefaultConfig(array $config, ContainerBuilder $container)
118
    {
119 2
        $config = array_merge([
120 2
            'use_driver' => 'file',
121 2
            'track' => [],
122 2
            'drivers' => [],
123 2
        ], $config);
124
125 2
        $config['track'] = array_merge([
126 2
            'clear_cache' => true,
127 2
        ], $config['track']);
128
129 2
        $config['drivers'] = array_merge([
130
            'multi' => [
131 2
                'fast' => 'shmop',
132 2
                'slow' => 'file',
133 2
            ],
134
            'shmop' => [
135 2
                'salt' => $container->getParameter('cache_time_keeper.driver.shmop.salt'),
136 2
            ],
137
            'file' => [
138 2
                'path' => $container->getParameter('cache_time_keeper.driver.file.path'),
139 2
            ],
140
            'memcache' => [
141 2
                'prefix' => 'cache_time_keeper_',
142 2
                'persistent_id' => 'cache_time_keeper',
143 2
                'hosts' => [],
144 2
            ],
145 2
        ], $config['drivers']);
146
147 2
        return $config;
148
    }
149
}
150