Completed
Push — master ( 30bcce...39fc8e )
by Peter
04:01
created

AnimeDbCacheTimeKeeperExtension   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 137
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 6
dl 0
loc 137
ccs 83
cts 83
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
B load() 0 46 2
A getRealServiceName() 0 8 2
B mergeBackwardCompatibilityConfig() 0 16 5
B mergeDefaultConfig() 0 40 1
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
10
namespace AnimeDb\Bundle\CacheTimeKeeperBundle\DependencyInjection;
11
12
use Symfony\Component\DependencyInjection\ContainerBuilder;
13
use Symfony\Component\Config\FileLocator;
14
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
15
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
16
17
class AnimeDbCacheTimeKeeperExtension extends Extension
18
{
19
    /**
20
     * @param array $configs
21
     * @param ContainerBuilder $container
22
     */
23 2
    public function load(array $configs, ContainerBuilder $container)
24
    {
25 2
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
26 2
        $loader->load('parameters.yml');
27 2
        $loader->load('services.yml');
28
29 2
        $configuration = new Configuration(
30 2
            $container->getParameter('cache_time_keeper.driver.shmop.salt'),
31 2
            $container->getParameter('cache_time_keeper.driver.file.path')
32 2
        );
33 2
        $config = $this->processConfiguration($configuration, $configs);
34
35 2
        $config = $this->mergeBackwardCompatibilityConfig($config, $container);
36 2
        $config = $this->mergeDefaultConfig($config, $container);
37
38
        // set params from config
39 2
        $container->setParameter('cache_time_keeper.enable', $config['enable']);
40 2
        $container->setParameter('cache_time_keeper.etag.algorithm', $config['etag_hasher']['algorithm']);
41 2
        $container->setParameter('cache_time_keeper.private_headers', $config['private_headers']);
42 2
        $container->setParameter('cache_time_keeper.track.clear_cache', $config['track']['clear_cache']);
43 2
        $container->setParameter('cache_time_keeper.track.individually', $config['track']['individually_entity']);
44 2
        $container->setParameter('cache_time_keeper.driver.shmop.salt', $config['drivers']['shmop']['salt']);
45 2
        $container->setParameter('cache_time_keeper.driver.file.path', $config['drivers']['file']['path']);
46 2
        $container->setParameter('cache_time_keeper.driver.memcache.prefix', $config['drivers']['memcache']['prefix']);
47
48
        // configure memcache
49 2
        $memcache = $container->getDefinition('cache_time_keeper.memcache');
50 2
        foreach ($config['drivers']['memcache']['hosts'] as $host) {
51 1
            $memcache->addMethodCall('addServer', $host);
52 2
        }
53
54
        // add service aliases
55 2
        $container->setAlias(
56 2
            'cache_time_keeper.driver',
57 2
            $this->getRealServiceName($config['use_driver'])
58 2
        );
59 2
        $container->setAlias(
60 2
            'cache_time_keeper.driver.multi.fast',
61 2
            $this->getRealServiceName($config['drivers']['multi']['fast'])
62 2
        );
63 2
        $container->setAlias(
64 2
            'cache_time_keeper.driver.multi.slow',
65 2
            $this->getRealServiceName($config['drivers']['multi']['slow'])
66 2
        );
67 2
        $container->setAlias('cache_time_keeper.cache_key_builder.etag_hasher', $config['etag_hasher']['driver']);
68 2
    }
69
70
    /**
71
     * @param string $name
72
     *
73
     * @return string
74
     */
75 2
    protected function getRealServiceName($name)
76
    {
77 2
        if (strpos($name, '.') === false) {
78 1
            return 'cache_time_keeper.driver.'.$name;
79
        }
80
81 1
        return $name;
82
    }
83
84
    /**
85
     * @param array $config
86
     * @param ContainerBuilder $container
87
     *
88
     * @return array
89
     */
90 2
    protected function mergeBackwardCompatibilityConfig(array $config, ContainerBuilder $container)
91
    {
92 2
        if ($container->hasParameter('cache_time_keeper.driver')) {
93 1
            $config['use_driver'] = $container->getParameter('cache_time_keeper.driver');
94 1
        }
95
96 2
        foreach (['fast', 'slow'] as $item) {
97 2
            if (empty($config['drivers']['multi'][$item]) &&
98 1
                $container->hasParameter('cache_time_keeper.driver.multi.'.$item)
99 2
            ) {
100 1
                $config['drivers']['multi'][$item] = $container->getParameter('cache_time_keeper.driver.multi.'.$item);
101 1
            }
102 2
        }
103
104 2
        return $config;
105
    }
106
107
    /**
108
     * @param array $config
109
     * @param ContainerBuilder $container
110
     *
111
     * @return array
112
     */
113 2
    protected function mergeDefaultConfig(array $config, ContainerBuilder $container)
114
    {
115 2
        $config = array_merge([
116 2
            'enable' => true,
117 2
            'use_driver' => 'file',
118 2
            'private_headers' => ['Authorization', 'Cookie'],
119 2
            'etag_hasher' => [],
120 2
            'track' => [],
121 2
            'drivers' => [],
122 2
        ], $config);
123
124 2
        $config['etag_hasher'] = array_merge([
125 2
            'driver' => 'cache_time_keeper.cache_key_builder.default_etag_hasher',
126 2
            'algorithm' => 'sha256',
127 2
        ], $config['etag_hasher']);
128
129 2
        $config['track'] = array_merge([
130 2
            'clear_cache' => true,
131 2
            'individually_entity' => false,
132 2
        ], $config['track']);
133
134 2
        $config['drivers'] = array_merge([
135
            'multi' => [
136 2
                'fast' => 'shmop',
137 2
                'slow' => 'file',
138 2
            ],
139
            'shmop' => [
140 2
                'salt' => $container->getParameter('cache_time_keeper.driver.shmop.salt'),
141 2
            ],
142
            'file' => [
143 2
                'path' => $container->getParameter('cache_time_keeper.driver.file.path'),
144 2
            ],
145
            'memcache' => [
146 2
                'prefix' => 'cache_time_keeper_',
147 2
                'hosts' => [],
148 2
            ],
149 2
        ], $config['drivers']);
150
151 2
        return $config;
152
    }
153
}
154