Completed
Pull Request — master (#14)
by Peter
06:30 queued 04:00
created

AnimeDbCacheTimeKeeperExtension::load()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 48
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 6
Bugs 1 Features 3
Metric Value
c 6
b 1
f 3
dl 0
loc 48
ccs 0
cts 40
cp 0
rs 9.125
cc 2
eloc 33
nc 2
nop 2
crap 6
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
    public function load(array $configs, ContainerBuilder $container)
23
    {
24
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
25
        $loader->load('parameters.yml');
26
        $loader->load('services.yml');
27
28
        $configuration = new Configuration(
29
            $container->getParameter('cache_time_keeper.driver.shmop.salt'),
30
            $container->getParameter('cache_time_keeper.driver.file.path')
31
        );
32
        $config = $this->processConfiguration($configuration, $configs);
33
34
        $config = $this->mergeBackwardCompatibilityConfig($config, $container);
35
        $config = $this->mergeDefaultConfig($config, $container);
36
37
        // configure drivers
38
        $container
39
            ->getDefinition('cache_time_keeper.driver.shmop')
40
            ->replaceArgument(0, $config['drivers']['shmop']['salt']);
41
        $container
42
            ->getDefinition('cache_time_keeper.driver.file')
43
            ->replaceArgument(0, $config['drivers']['file']['path']);
44
        $container
45
            ->getDefinition('cache_time_keeper.driver.memcached')
46
            ->replaceArgument(1, $config['drivers']['memcached']['prefix']);
47
48
        // configure memcached
49
        $memcached = $container
50
            ->getDefinition('cache_time_keeper.memcached')
51
            ->replaceArgument(0, $config['drivers']['memcached']['persistent_id']);
52
        foreach ($config['drivers']['memcached']['hosts'] as $host) {
53
            $memcached->addMethodCall('addServer', $host);
54
        }
55
56
        // add service aliases
57
        $container->setAlias(
58
            'cache_time_keeper.driver',
59
            $this->getRealServiceName($config['use_driver'])
60
        );
61
        $container->setAlias(
62
            'cache_time_keeper.driver.multi.fast',
63
            $this->getRealServiceName($config['drivers']['multi']['fast'])
64
        );
65
        $container->setAlias(
66
            'cache_time_keeper.driver.multi.slow',
67
            $this->getRealServiceName($config['drivers']['multi']['slow'])
68
        );
69
    }
70
71
    /**
72
     * @param string $name
73
     *
74
     * @return string
75
     */
76
    protected function getRealServiceName($name)
77
    {
78
        if (strpos($name, '.') === false) {
79
            return 'cache_time_keeper.driver.'.$name;
80
        }
81
82
        return $name;
83
    }
84
85
    /**
86
     * @param array $config
87
     * @param ContainerBuilder $container
88
     *
89
     * @return array
90
     */
91
    protected function mergeBackwardCompatibilityConfig(array $config, ContainerBuilder $container)
92
    {
93
        $default_config = [];
94
95
        if ($container->hasParameter('cache_time_keeper.driver')) {
96
            $default_config['use_driver'] = $container->getParameter('cache_time_keeper.driver');
97
        }
98
99
        if ($container->hasParameter('cache_time_keeper.driver.multi.fast')) {
100
            $default_config['drivers']['multi']['fast'] = $container
101
                ->getParameter('cache_time_keeper.driver.multi.fast');
102
        }
103
104
        if ($container->hasParameter('cache_time_keeper.driver.multi.slow')) {
105
            $default_config['drivers']['multi']['slow'] = $container
106
                ->getParameter('cache_time_keeper.driver.multi.slow');
107
        }
108
109
        return array_merge($default_config, $config);
110
    }
111
112
    /**
113
     * @param array $config
114
     * @param ContainerBuilder $container
115
     *
116
     * @return array
117
     */
118
    protected function mergeDefaultConfig(array $config, ContainerBuilder $container)
119
    {
120
        return array_merge([
121
            'use_driver' => 'file',
122
            'drivers' => [
123
                'multi' => [
124
                    'fast' => 'shmop',
125
                    'slow' => 'file',
126
                ],
127
                'shmop' => [
128
                    'salt' => $container->getParameter('cache_time_keeper.driver.shmop.salt'),
129
                ],
130
                'file' => [
131
                    'path' => $container->getParameter('cache_time_keeper.driver.file.path'),
132
                ],
133
                'memcached' => [
134
                    'prefix' => 'cache_time_keeper_',
135
                    'persistent_id' => 'cache_time_keeper',
136
                    'hosts' => [],
137
                ],
138
            ],
139
        ], $config);
140
    }
141
}
142