Config::setServers()   D
last analyzed

Complexity

Conditions 21
Paths 9

Size

Total Lines 32
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 21
eloc 16
nc 9
nop 1
dl 0
loc 32
rs 4.1666
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 *
5
 * This file is part of Phpfastcache.
6
 *
7
 * @license MIT License (MIT)
8
 *
9
 * For full copyright and license information, please see the docs/CREDITS.txt and LICENCE files.
10
 *
11
 * @author Georges.L (Geolim4)  <[email protected]>
12
 * @author Contributors  https://github.com/PHPSocialNetwork/phpfastcache/graphs/contributors
13
 */
14
15
declare(strict_types=1);
16
17
namespace Phpfastcache\Drivers\Memcache;
18
19
use Phpfastcache\Config\ConfigurationOption;
20
use Phpfastcache\Exceptions\PhpfastcacheDriverException;
21
use Phpfastcache\Exceptions\PhpfastcacheInvalidConfigurationException;
22
use Phpfastcache\Exceptions\PhpfastcacheLogicException;
23
24
class Config extends ConfigurationOption
25
{
26
    /**
27
     * @var array
28
     *
29
     * Multiple server can be added this way:
30
     *       $cfg->setServers([
31
     *         [
32
     *           // If you use an UNIX socket set the host and port to null
33
     *           'host' => '127.0.0.1',
34
     *           //'path' => 'path/to/unix/socket',
35
     *           'port' => 11211,
36
     *         ]
37
     *      ]);
38
     */
39
40
    /** @var array<array<string, mixed>>  */
41
    protected array $servers = [];
42
    protected string $host = '127.0.0.1';
43
    protected int $port = 11211;
44
45
    /**
46
     * @return array<array<string, mixed>>
47
     */
48
    public function getServers(): array
49
    {
50
        if (!count($this->servers)) {
51
            return [
52
                [
53
                    'host' => $this->getHost(),
54
                    'path' => $this->getPath(),
55
                    'port' => $this->getPort(),
56
                ],
57
            ];
58
        }
59
60
        return $this->servers;
61
    }
62
63
    /**
64
     * @param array<array<string, mixed>> $servers
65
     * @return self
66
     * @throws PhpfastcacheInvalidConfigurationException
67
     * @throws PhpfastcacheLogicException
68
     *
69
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
70
     * @SuppressWarnings(PHPMD.NPathComplexity)
71
     */
72
    public function setServers(array $servers): static
73
    {
74
        foreach ($servers as $server) {
75
            if (\array_key_exists('saslUser', $server) || array_key_exists('saslPassword', $server)) {
76
                throw new PhpfastcacheInvalidConfigurationException('Unlike Memcached, Memcache does not support SASL authentication');
77
            }
78
79
            if ($diff = array_diff(array_keys($server), ['host', 'port', 'path'])) {
80
                throw new PhpfastcacheInvalidConfigurationException('Unknown keys for memcached server: ' . implode(', ', $diff));
81
            }
82
83
            if (!empty($server['host']) && !empty($server['path'])) {
84
                throw new PhpfastcacheInvalidConfigurationException('Host and path cannot be simultaneous defined.');
85
            }
86
87
            if ((isset($server['host']) && !is_string($server['host'])) || (empty($server['path']) && empty($server['host']))) {
88
                throw new PhpfastcacheInvalidConfigurationException('Host must be a valid string in "$server" configuration array if path is not defined');
89
            }
90
91
            if ((isset($server['path']) && !is_string($server['path'])) || (empty($server['host']) && empty($server['path']))) {
92
                throw new PhpfastcacheInvalidConfigurationException('Path must be a valid string in "$server" configuration array if host is not defined');
93
            }
94
95
            if (!empty($server['host']) && (empty($server['port']) || !is_int($server['port']) || $server['port'] < 1)) {
96
                throw new PhpfastcacheInvalidConfigurationException('Port must be a valid integer in "$server" configuration array');
97
            }
98
99
            if (!empty($server['port']) && !empty($server['path'])) {
100
                throw new PhpfastcacheInvalidConfigurationException('Port should not be defined along with path');
101
            }
102
        }
103
        return $this->setProperty('servers', $servers);
104
    }
105
106
    /**
107
     * @return string
108
     */
109
    public function getHost(): string
110
    {
111
        return $this->host;
112
    }
113
114
    /**
115
     * @param string $host
116
     * @return self
117
     * @throws PhpfastcacheLogicException
118
     */
119
    public function setHost(string $host): static
120
    {
121
        return $this->setProperty('host', $host);
122
    }
123
124
    /**
125
     * @return int
126
     */
127
    public function getPort(): int
128
    {
129
        return $this->port;
130
    }
131
132
    /**
133
     * @param int $port
134
     * @return self
135
     * @throws PhpfastcacheLogicException
136
     */
137
    public function setPort(int $port): static
138
    {
139
        return $this->setProperty('port', $port);
140
    }
141
}
142