Passed
Push — master ( 2b4fc9...b96bac )
by Andreas
17:22
created

cachePass::prepare_memcached()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2.0116

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
nc 2
nop 1
dl 0
loc 10
ccs 6
cts 7
cp 0.8571
crap 2.0116
rs 10
c 1
b 0
f 0
1
<?php
2
namespace midcom\bundle\dependencyInjection;
3
4
use Symfony\Component\DependencyInjection\ContainerBuilder;
5
use Symfony\Component\DependencyInjection\Reference;
6
use Memcached;
7
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
8
use Symfony\Component\Cache\Adapter\ApcuAdapter;
9
use Symfony\Component\Cache\Adapter\MemcachedAdapter;
10
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
11
use Symfony\Component\Cache\Adapter\PdoAdapter;
12
use Symfony\Component\Cache\Adapter\AdapterInterface;
13
use Symfony\Component\Cache\Adapter\NullAdapter;
14
15
class cachePass implements CompilerPassInterface
16
{
17
    const NS_PLACEHOLDER = '__NAMESPACE__';
18
19
    public static function factory(string $name, string $classname, ...$args) : AdapterInterface
20
    {
21
        foreach ($args as &$arg) {
22
            if ($arg === self::NS_PLACEHOLDER) {
23
                $arg = $name . $_SERVER['SERVER_NAME'];
24
            }
25
        }
26
        return new $classname(...$args);
27
    }
28
29 4
    public function process(ContainerBuilder $container)
30
    {
31 4
        foreach ($container->getParameter('midcom.cache_autoload_queue') as $name) {
32 4
            $container->getDefinition('cache')
33 4
                ->addMethodCall('add_module', [$name, new Reference('cache.module.' . $name)]);
34
35 4
            if (in_array($name, ['nap', 'memcache'])) {
36 3
                if ($driver = $container->getParameter('midcom.cache_module_memcache_backend')) {
37 3
                    $config = $container->getParameter('midcom.cache_module_memcache_backend_config');
38 3
                    $this->configure_backend($name, $driver, $config, $container);
39
                }
40
            } else {
41 1
                $config = $container->getParameter('midcom.cache_module_content_backend');
42 1
                if (!empty($config['driver'])) {
43 1
                    if (!isset($config['directory'])) {
44 1
                        $config['directory'] = 'content/';
45
                    }
46
47 1
                    $this->configure_backend('content', $config['driver'], $config, $container);
0 ignored issues
show
Bug introduced by
It seems like $config can also be of type boolean and double and integer and null and string; however, parameter $config of midcom\bundle\dependency...ss::configure_backend() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

47
                    $this->configure_backend('content', $config['driver'], /** @scrutinizer ignore-type */ $config, $container);
Loading history...
48 1
                    $this->configure_backend('content_data', $config['driver'], $config, $container);
49
                }
50
            }
51
        }
52 4
    }
53
54 4
    private function configure_backend(string $name, string $driver, array $config, ContainerBuilder $container)
55
    {
56 4
        $backend = $container->getDefinition('cache.module.' . $name . '.backend');
57 4
        $directory = $container->getParameter('kernel.cache_dir');
58
59 4
        if (!empty($config['directory'])) {
60 1
            $directory .= '/' . $config['directory'];
61
        }
62
63 4
        switch ($driver) {
64 4
            case 'apc':
65 1
                $backend->setArguments([$name, ApcuAdapter::class, self::NS_PLACEHOLDER]);
66 1
                break;
67 3
            case 'memcached':
68 1
                if ($memcached = self::prepare_memcached($config)) {
69
70 1
                    $definition = $container->register('cache.memcached.' . $name, \Memcached::class);
71 1
                    $server = $memcached->getServerList()[0];
72 1
                    $definition->addMethodCall('addServer', [$server['host'], $server['port']]);
73
74 1
                    $backend->setArguments([$name, MemcachedAdapter::class, $definition, self::NS_PLACEHOLDER]);
75 1
                    break;
76
                }
77
                // fall-through
78 2
            case 'dba':
79 2
            case 'flatfile':
80 1
                $backend->setArguments([$name, FilesystemAdapter::class, self::NS_PLACEHOLDER, 0, $directory . '/' . $name]);
81 1
                break;
82 1
            case 'sqlite':
83 1
                $backend->setArguments([$name, PdoAdapter::class, "{$directory}/sqlite.db", self::NS_PLACEHOLDER]);
84 1
                break;
85
            default:
86
                $backend->setArguments([$name, NullAdapter::class]);
87
        }
88 4
    }
89
90 2
    public static function prepare_memcached(array $config) : ?Memcached
91
    {
92 2
        $host = $config['host'] ?? 'localhost';
93 2
        $port = $config['port'] ?? 11211;
94 2
        $memcached = new Memcached;
95 2
        if (!$memcached->addServer($host, $port)) {
96
            return null;
97
        }
98
99 2
        return $memcached;
100
    }
101
}