AuraSqlModule::configure()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 8
cts 8
cp 1
rs 9.9332
c 0
b 0
f 0
cc 2
nc 2
nop 0
crap 2
1
<?php
2
/**
3
 * This file is part of the Ray.AuraSqlModule package.
4
 *
5
 * @license http://opensource.org/licenses/MIT MIT
6
 */
7
namespace Ray\AuraSqlModule;
8
9
use Aura\Sql\ConnectionLocator;
10
use Aura\Sql\ExtendedPdo;
11
use Aura\Sql\ExtendedPdoInterface;
12
use Ray\AuraSqlModule\Pagerfanta\AuraSqlPagerModule;
13
use Ray\Di\AbstractModule;
14
use Ray\Di\Scope;
15
16
class AuraSqlModule extends AbstractModule
17
{
18
    const PARSE_PDO_DSN_REGEX = '/(.*?)\:(?:(host|server)=.*?;)?(.*)/i';
19
20
    /**
21
     * @var string
22
     */
23
    private $dsn;
24
25
    /**
26
     * @var string
27
     */
28
    private $user;
29
30
    /**
31
     * @var string
32
     */
33
    private $password;
34
35
    /**
36
     * @var string
37
     */
38
    private $slave;
39
40
    /**
41
     * @param string $dsn
42
     * @param string $user
43
     * @param string $password
44
     * @param string $slave    comma separated slave host list
45
     */
46 8
    public function __construct(string $dsn, string $user = '', string $password = '', string $slave = '')
47
    {
48 8
        $this->dsn = $dsn;
49 8
        $this->user = $user;
50 8
        $this->password = $password;
51 8
        $this->slave = $slave;
52 8
        parent::__construct();
53 8
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58 8
    protected function configure()
59
    {
60 8
        $this->slave ? $this->configureMasterSlaveDsn() : $this->configureSingleDsn();
61
        // @Transactional
62 8
        $this->install(new TransactionalModule);
0 ignored issues
show
Documentation introduced by
new \Ray\AuraSqlModule\TransactionalModule() is of type object<Ray\AuraSqlModule\TransactionalModule>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
63 8
        $this->install(new AuraSqlPagerModule());
0 ignored issues
show
Documentation introduced by
new \Ray\AuraSqlModule\P...ta\AuraSqlPagerModule() is of type object<Ray\AuraSqlModule...nta\AuraSqlPagerModule>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
64 8
        \preg_match(self::PARSE_PDO_DSN_REGEX, $this->dsn, $parts);
65 8
        $dbType = $parts[1] ?? '';
66 8
        $this->install(new AuraSqlQueryModule($dbType));
0 ignored issues
show
Documentation introduced by
new \Ray\AuraSqlModule\AuraSqlQueryModule($dbType) is of type object<Ray\AuraSqlModule\AuraSqlQueryModule>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
67 8
    }
68
69 6
    private function configureSingleDsn()
70
    {
71 6
        $this->bind(ExtendedPdoInterface::class)->toConstructor(ExtendedPdo::class, 'dsn=pdo_dsn,username=pdo_user,password=pdo_pass,options=pdo_option')->in(Scope::SINGLETON);
72 6
        $this->bind()->annotatedWith('pdo_dsn')->toInstance($this->dsn);
73 6
        $this->bind()->annotatedWith('pdo_user')->toInstance($this->user);
74 6
        $this->bind()->annotatedWith('pdo_pass')->toInstance($this->password);
75 6
        $this->bind()->annotatedWith('pdo_option')->toInstance([]);
76 6
    }
77
78 2
    private function configureMasterSlaveDsn()
79
    {
80 2
        $locator = new ConnectionLocator;
81 2
        $locator->setWrite('master', new Connection($this->dsn, $this->user, $this->password));
82 2
        $i = 1;
83 2
        $slaves = \explode(',', $this->slave);
84 2
        foreach ($slaves as $slave) {
85 2
            $slaveDsn = $this->changeHost($this->dsn, $slave);
86 2
            $name = 'slave' . (string) $i++;
87 2
            $locator->setRead($name, new Connection($slaveDsn, $this->user, $this->password));
88
        }
89 2
        $this->install(new AuraSqlReplicationModule($locator));
0 ignored issues
show
Documentation introduced by
new \Ray\AuraSqlModule\A...icationModule($locator) is of type object<Ray\AuraSqlModule...raSqlReplicationModule>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
90 2
    }
91
92 2
    private function changeHost($dsn, $host) : string
93
    {
94 2
        \preg_match(self::PARSE_PDO_DSN_REGEX, $dsn, $parts);
95 2
        if (! $parts) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $parts of type string[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
96
            return $dsn;
97
        }
98 2
        $dsn = \sprintf('%s:%s=%s;%s', $parts[1], $parts[2], $host, $parts[3]);
99
100 2
        return $dsn;
101
    }
102
}
103