Completed
Push — master ( 7a6bdd...324ce1 )
by Sébastien
09:34
created

ConnectionManager::addConnection()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 22
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 22
ccs 10
cts 10
cp 1
rs 9.6111
cc 5
nc 4
nop 2
crap 5
1
<?php
2
3
namespace Bdf\Prime;
4
5
use Bdf\Prime\Connection\ConnectionInterface;
6
use Bdf\Prime\Connection\ConnectionRegistry;
7
use Bdf\Prime\Connection\SubConnectionManagerInterface;
8
use Bdf\Prime\Exception\DBALException;
0 ignored issues
show
introduced by
Unused use statement
Loading history...
9
use LogicException;
10
11
/**
12
 * ConnectionManager
13
 * 
14
 * doctrine dbal connection registry
0 ignored issues
show
Coding Style introduced by
Doc comment long description must start with a capital letter
Loading history...
introduced by
Doc comment long description must end with a full stop
Loading history...
15
 */
16
class ConnectionManager implements ConnectionRegistryInterface
17
{
18
    /**
19
     * The connection registry
20
     *
21
     * @var ConnectionRegistryInterface
22
     */
23
    private $registry;
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line(s) before first member var; 0 found
Loading history...
24
25
    /**
26
     * Connections list
27
     *
28
     * @var ConnectionInterface[]
29
     */
30
    private $connections = [];
31
32
    /**
33
     * Default connection to use
34
     * 
35
     * @var string 
0 ignored issues
show
introduced by
Expected "string" but found "string " for @var tag in member variable comment
Loading history...
36
     */
37
    private $defaultConnection;
38
39
40
    /**
41
     * Set default configuration
42
     *
43
     * @param ConnectionRegistryInterface $registry
44
     */
45 180
    public function __construct(ConnectionRegistryInterface $registry = null)
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line before function; 2 found
Loading history...
46
    {
47 180
        $this->registry = $registry ?: new ConnectionRegistry();
0 ignored issues
show
Coding Style introduced by
The value of a comparison must not be assigned to a variable
Loading history...
Coding Style introduced by
Inline IF statements are not allowed
Loading history...
Coding Style introduced by
Inline shorthand IF statement requires brackets around comparison
Loading history...
48 180
    }
49
50
    /**
51
     * Add database connection
52
     *
53
     * @param ConnectionInterface $connection Unique name for the connection
54
     * @param boolean             $default    Use this connection as the default? The first connection added is automatically set as the default, even if this flag is false.
0 ignored issues
show
introduced by
Expected "bool" but found "boolean" for parameter type
Loading history...
55
     *
56
     * @throws LogicException if connection exists
0 ignored issues
show
introduced by
@throws comment must be on the next line
Loading history...
introduced by
@throws tag comment must start with a capital letter
Loading history...
introduced by
@throws tag comment must end with a full stop
Loading history...
57
     */
58 145
    public function addConnection(/* ConnectionInterface */ $connection, /* bool */ $default = false)
0 ignored issues
show
introduced by
Type hint "ConnectionInterface" missing for $connection
Loading history...
Coding Style introduced by
Single line block comment not allowed; use inline ("// text") comment instead
Loading history...
59
    {
60
        // Legacy
61 145
        if (!$connection instanceof ConnectionInterface) {
0 ignored issues
show
introduced by
$connection is always a sub-type of Bdf\Prime\Connection\ConnectionInterface.
Loading history...
62 12
            @trigger_error(__METHOD__.' signature change. Use addParameter to add lazy loading conenction info.', E_USER_DEPRECATED);
0 ignored issues
show
Coding Style introduced by
Silencing errors is discouraged; found: @trigger_error(__METHOD__...
Loading history...
introduced by
The trigger_error message '__METHOD__ signature change. Use addParameter to add lazy loading conenction info.' does not match the relaxed standard format: thing is deprecated in deprecation-version any free text removal-version. extra-info. See cr-link
Loading history...
63
64 12
            $this->declareConnection($connection, $default);
65
66 12
            return $this->getConnection($connection);
67
        }
68
69
        // Connection name must be unique
70 145
        if (isset($this->connections[$connection->getName()])) {
71 1
            throw new LogicException('Connection for "'.$connection->getName().'" already exists. Connection name must be unique.');
72
        }
73
74
        // Set as default connection?
0 ignored issues
show
Unused Code Comprehensibility introduced by
38% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
75 145
        if (true === $default || null === $this->defaultConnection) {
76 131
            $this->defaultConnection = $connection->getName();
77
        }
78
79 145
        $this->connections[$connection->getName()] = $connection;
80 145
    }
81
82
    /**
83
     * Remove a connection by its name
84
     *
85
     * @param string $name
86
     */
87 34
    public function removeConnection(string $name)
88
    {
89 34
        if (!isset($this->connections[$name])) {
90 22
            return;
91
        }
92
        
93 12
        $this->connections[$name]->close();
0 ignored issues
show
Bug introduced by
The method close() does not exist on Bdf\Prime\Connection\ConnectionInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to Bdf\Prime\Connection\ConnectionInterface. ( Ignorable by Annotation )

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

93
        $this->connections[$name]->/** @scrutinizer ignore-call */ 
94
                                   close();
Loading history...
94 12
        unset($this->connections[$name]);
95 12
    }
96
97
    /**
98
     * Get connection by name
99
     *
100
     * @param string $name Unique name of the connection to be returned
101
     * 
102
     * @return ConnectionInterface
103
     * 
104
     * @throws DBALException
0 ignored issues
show
introduced by
Comment missing for @throws tag in function comment
Loading history...
105
     *
106
     * @deprecated Since 1.1 use getConnection
0 ignored issues
show
introduced by
The text '@deprecated Since 1.1 use getConnection' does not match the standard format: @deprecated in deprecation-version and is removed from removal-version. extra-info.
Loading history...
introduced by
Each @deprecated tag must have a @see tag immediately following it.
Loading history...
107
     */
108
    public function connection(string $name = null): ConnectionInterface
109
    {
110
        return $this->getConnection($name);
111
    }
112
113
    /**
0 ignored issues
show
Coding Style introduced by
Parameter $name should have a doc-comment as per coding-style.
Loading history...
114
     * {@inheritDoc}
115
     */
116 1073
    public function getConnection(string $name = null): ConnectionInterface
117
    {
118 1073
        if ($name === null) {
119 6
            $name = $this->defaultConnection;
120
        }
121
122
        // Connection name must be unique
123 1073
        if (!isset($this->connections[$name]) && !$this->loadSubConnection($name)) {
124 140
            $this->addConnection($this->registry->getConnection($name));
125
        }
126
127 1072
        return $this->connections[$name];
128
    }
129
130
    /**
131
     * Associate configuration to connection
132
     *
133
     * @param string $connectionName
134
     * @param string|array $parameters
135
     */
136 35
    public function declareConnection(string $connectionName, $parameters)
137
    {
138 35
        if ($this->registry instanceof ConnectionRegistry) {
139 35
            $this->registry->declareConnection($connectionName, $parameters);
140
        }
141 35
    }
142
143
    /**
144
     * Get global config
145
     *
146
     * @return Configuration
147
     *
148
     * @deprecated Every connection should have its config.
0 ignored issues
show
introduced by
The text '@deprecated Every connection should have its config.' does not match the standard format: @deprecated in deprecation-version and is removed from removal-version. extra-info.
Loading history...
introduced by
Each @deprecated tag must have a @see tag immediately following it.
Loading history...
149
     */
150 147
    public function config(): Configuration
151
    {
152 147
        @trigger_error(__METHOD__.' is deprecated since 1.1 and will be removed in 1.2. Every connection should have its config.', E_USER_DEPRECATED);
0 ignored issues
show
Coding Style introduced by
Silencing errors is discouraged; found: @trigger_error(__METHOD__...
Loading history...
introduced by
The trigger_error message '__METHOD__ is deprecated since 1.1 and will be removed in 1.2. Every connection should have its config.' does not match the strict standard format: thing is deprecated in deprecation-version and is removed from removal-version. extra-info. See cr-link
Loading history...
153
154 147
        if ($this->registry instanceof ConnectionRegistry) {
155 147
            return $this->registry->getDefaultConfiguration();
156
        }
157
158
        return new Configuration();
159
    }
160
161
    /**
162
     * Get all connections
163
     *
164
     * @return ConnectionInterface[] Array of connection objects
165
     */
166 1104
    public function connections()
167
    {
168 1104
        return $this->connections;
169
    }
170
171
    /**
172
     * {@inheritDoc}
173
     */
174 3
    public function getConnectionNames(): array
175
    {
176 3
        return array_unique(array_merge($this->getCurrentConnectionNames(), $this->registry->getConnectionNames()));
177
    }
0 ignored issues
show
Coding Style introduced by
Expected 1 blank line after function; 0 found
Loading history...
178
    /**
179
     * Get the loaded connection name
180
     *
181
     * @return string[] Array of connection name
182
     *
183
     * @deprecated Since 1.1 use getConnectionNames
0 ignored issues
show
introduced by
The text '@deprecated Since 1.1 use getConnectionNames' does not match the standard format: @deprecated in deprecation-version and is removed from removal-version. extra-info.
Loading history...
introduced by
Each @deprecated tag must have a @see tag immediately following it.
Loading history...
184
     */
185 1
    public function connectionNames(): array
186
    {
187 1
        return $this->getConnectionNames();
188
    }
189
190
    /**
191
     * Gets the name of connections in progress
192
     */
193 3
    public function getCurrentConnectionNames(): array
194
    {
195 3
        return array_keys($this->connections);
196
    }
197
198
    /**
199
     * Set the default connection name
200
     *
201
     * @param string $name
202
     */
203 1
    public function setDefaultConnection($name)
204
    {
205 1
        $this->defaultConnection = $name;
206 1
    }
207
208
    /**
209
     * Get the default connection name
210
     *
211
     * @return string
212
     */
213 2
    public function getDefaultConnection()
214
    {
215 2
        return $this->defaultConnection;
216
    }
217
218
    /**
219
     * Try to load a sub connection
220
     *
221
     * This method allows connection as "name.otherName".
222
     * Works only if connection "name" is a SubConnectionManagerInterface.
223
     *
224
     * @param string $connectionName
225
     * 
226
     * @return bool  The connection has been loaded
0 ignored issues
show
Coding Style introduced by
Expected "boolean" but found "bool" for function return type
Loading history...
227
     */
228 140
    private function loadSubConnection($connectionName)
0 ignored issues
show
Coding Style introduced by
Private method name "ConnectionManager::loadSubConnection" must be prefixed with an underscore
Loading history...
229
    {
230 140
        $names = explode('.', $connectionName, 2);
231
232 140
        if (!isset($names[1])) {
233 140
            return false;
234
        }
235
236 2
        $connection = $this->getConnection($names[0]);
237
238 2
        if ($connection instanceof SubConnectionManagerInterface) {
239
            //TODO doit on concerver une reference sur la sous connection ?
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
Coding Style introduced by
No space found before comment text; expected "// TODO doit on concerver une reference sur la sous connection ?" but found "//TODO doit on concerver une reference sur la sous connection ?"
Loading history...
240 2
            $this->connections[$connectionName] = $connection->getConnection($names[1]);
241 2
            return true;
242
        }
243
244
        return false;
245
    }
246
}
247