Completed
Push — master ( cc5773...13d672 )
by Jacob
12s
created

Persisters::createConfiguration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 17
rs 9.4285
cc 1
eloc 13
nc 1
nop 2
1
<?php
2
3
namespace As3\Bundle\ModlrBundle\DependencyInjection\ServiceLoader;
4
5
use As3\Bundle\ModlrBundle\DependencyInjection\Utility;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Definition;
8
use Symfony\Component\DependencyInjection\Reference;
9
10
/**
11
 * Loads persister services.
12
 *
13
 * @author  Jacob Bare <[email protected]>
14
 */
15
class Persisters implements ServiceLoaderInterface
16
{
17
    /**
18
     * {@inheritdoc}
19
     */
20 View Code Duplication
    public function load(array $config, ContainerBuilder $container)
21
    {
22
        $managerDef = $container->getDefinition(Utility::getAliasedName('storage_manager'));
23
24
        foreach ($config['persisters'] as $name => $persisterConfig) {
25
            $persisterName = Utility::getAliasedName(sprintf('persister.%s', $name));
26
            if (isset($persisterConfig['service'])) {
27
                // Custom persister.
28
                $container->setAlias($persisterName, Utility::cleanServiceName($persisterConfig['service']));
29
            } else {
30
                // Built-in persister.
31
                switch ($persisterConfig['type']) {
32
                    case 'mongodb':
33
                        $definition = $this->createMongoDbPersister($persisterName, $persisterConfig, $container);
34
                        break;
35
                    default:
36
                        throw new \RuntimeException(sprintf('The persister type "%s" is currently not supported.', $persisterConfig['type']));
37
                }
38
                $container->setDefinition($persisterName, $definition);
39
            }
40
            $managerDef->addMethodCall('addPersister', [new Reference($persisterName)]);
41
        }
42
        return $this;
43
    }
44
45
    /**
46
     * Creates the connection service definition.
47
     *
48
     * @param   array   $persisterConfig
49
     * @param   string  $configName         The name of the connection configuration service
50
     * @return  Definition
51
     */
52
    private function createConnection(array $persisterConfig, $configName)
53
    {
54
        $options = isset($persisterConfig['parameters']['options']) && is_array($persisterConfig['parameters']['options']) ? $persisterConfig['parameters']['options'] : [];
55
        $definition = new Definition(
56
            'Doctrine\MongoDB\Connection',
57
            [$persisterConfig['parameters']['host'], $options, new Reference($configName)]
58
        );
59
        $definition->setPublic(false);
60
        return $definition;
61
    }
62
63
    /**
64
     * Creates the connection configuration service definition.
65
     *
66
     * @return  Definition
67
     */
68
    private function createConfiguration($persisterName, $container)
69
    {
70
        $loggerName = sprintf('%s.logger', $persisterName);
71
        $definition = new Definition(
72
            Utility::getLibraryClass('Persister\MongoDb\Logger'),
73
            [new Reference('logger')]
74
        );
75
        $definition->addTag('monolog.logger', ['channel' => 'as3_modlr']);
76
        $definition->setPublic(false);
77
        $container->setDefinition($loggerName, $definition);
78
79
        $definition = new Definition('Doctrine\MongoDB\Configuration');
80
        $definition->addMethodCall('setLoggerCallable', [[new Reference($loggerName), 'logQuery']]);
81
        $definition->addTag('monolog.logger', ['channel' => 'as3_modlr']);
82
        $definition->setPublic(false);
83
        return $definition;
84
    }
85
86
    /**
87
     * Creates the persistence formatter service definition.
88
     *
89
     * @return  Definition
90
     */
91
    private function createFormatter()
92
    {
93
        $definition = new Definition(
94
            Utility::getLibraryClass('Persister\MongoDb\Formatter')
95
        );
96
        $definition->setPublic(false);
97
        return $definition;
98
    }
99
100
    /**
101
     * Creates the MongoDB persister service definition.
102
     * Will also load support services.
103
     *
104
     * @param   string              $persisterName
105
     * @param   array               $persisterConfig
106
     * @param   ContainerBuilder    $container
107
     * @return  Definition
108
     */
109
    private function createMongoDbPersister($persisterName, array $persisterConfig, ContainerBuilder $container)
110
    {
111
        // Storage metadata
112
        $smfName = sprintf('%s.metadata', $persisterName);
113
        $definition = $this->createSmf();
114
        $container->setDefinition($smfName, $definition);
115
116
        // Configuration
117
        $configName = sprintf('%s.configuration', $persisterName);
118
        $definition = $this->createConfiguration($persisterName, $container);
119
        $container->setDefinition($configName, $definition);
120
121
        // Connection
122
        $conName = sprintf('%s.connection', $persisterName);
123
        $definition = $this->createConnection($persisterConfig, $configName);
124
        $container->setDefinition($conName, $definition);
125
126
        // Formatter
127
        $formatterName = sprintf('%s.formatter', $persisterName);
128
        $definition = $this->createFormatter();
129
        $container->setDefinition($formatterName, $definition);
130
131
        // Query
132
        $queryName = sprintf('%s.query', $persisterName);
133
        $definition = $this->createQuery($conName, $formatterName);
134
        $container->setDefinition($queryName, $definition);
135
136
        // Persister
137
        return new Definition(
138
            Utility::getLibraryClass('Persister\MongoDb\Persister'),
139
            [new Reference($queryName), new Reference($smfName)]
140
        );
141
    }
142
143
    /**
144
     * Creates the storage metadata factory service definition.
145
     *
146
     * @return  Definition
147
     */
148 View Code Duplication
    private function createSmf()
149
    {
150
        $definition = new Definition(
151
            Utility::getLibraryClass('Persister\MongoDb\StorageMetadataFactory'),
152
            [new Reference(Utility::getAliasedName('util.entity'))]
153
        );
154
        $definition->setPublic(false);
155
        return $definition;
156
    }
157
158
    private function createQuery($conName, $formatterName)
159
    {
160
        $definition = new Definition(
161
            Utility::getLibraryClass('Persister\MongoDb\Query'),
162
            [new Reference($conName), new Reference($formatterName)]
163
        );
164
        return $definition;
165
    }
166
}
167