Completed
Push — options ( 54df3e...c25fe1 )
by Akihito
01:59
created

AuraSqlModule::configure()   A

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
c 0
b 0
f 0
ccs 8
cts 8
cp 1
rs 9.9332
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
     * @var array
42
     */
43
    private $options;
44
45
    /**
46
     * @var array
47
     */
48
    private $attributes;
49
50
    /**
51
     * @param string $dsn
52
     * @param string $user
53
     * @param string $password
54
     * @param string $slave    comma separated slave host list
55
     * @param array  $options
56
     */
57 8
    public function __construct(string $dsn, string $user = '', string $password = '', string $slave = '', array $options = [], array $attributes = [])
58
    {
59 8
        $this->dsn = $dsn;
60 8
        $this->user = $user;
61 8
        $this->password = $password;
62 8
        $this->slave = $slave;
63 8
        $this->options = $options;
64 8
        $this->attributes = $attributes;
65 8
        parent::__construct();
66 8
    }
67
68
    /**
69
     * {@inheritdoc}
70
     */
71 8
    protected function configure()
72
    {
73 8
        $this->slave ? $this->configureMasterSlaveDsn() : $this->configureSingleDsn();
74
        // @Transactional
75 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...
76 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...
77 8
        \preg_match(self::PARSE_PDO_DSN_REGEX, $this->dsn, $parts);
78 8
        $dbType = $parts[1] ?? '';
79 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...
80 8
    }
81
82 6
    private function configureSingleDsn()
83
    {
84 6
        $this->bind(ExtendedPdoInterface::class)->toConstructor(ExtendedPdo::class, 'dsn=pdo_dsn,username=pdo_user,password=pdo_pass,options=pdo_options,attributes=pdo_attributes')->in(Scope::SINGLETON);
85 6
        $this->bind()->annotatedWith('pdo_dsn')->toInstance($this->dsn);
86 6
        $this->bind()->annotatedWith('pdo_user')->toInstance($this->user);
87 6
        $this->bind()->annotatedWith('pdo_pass')->toInstance($this->password);
88 6
        $this->bind()->annotatedWith('pdo_options')->toInstance($this->options);
89 6
        $this->bind()->annotatedWith('pdo_attributes')->toInstance($this->options);
90 6
    }
91
92 2
    private function configureMasterSlaveDsn()
93
    {
94 2
        $locator = new ConnectionLocator;
95 2
        $locator->setWrite('master', new Connection($this->dsn, $this->user, $this->password));
96 2
        $i = 1;
97 2
        $slaves = \explode(',', $this->slave);
98 2
        foreach ($slaves as $slave) {
99 2
            $slaveDsn = $this->changeHost($this->dsn, $slave);
100 2
            $name = 'slave' . (string) $i++;
101 2
            $locator->setRead($name, new Connection($slaveDsn, $this->user, $this->password));
102
        }
103 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...
104 2
    }
105
106 2
    private function changeHost($dsn, $host) : string
107
    {
108 2
        \preg_match(self::PARSE_PDO_DSN_REGEX, $dsn, $parts);
109 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...
110
            return $dsn;
111
        }
112 2
        $dsn = \sprintf('%s:%s=%s;%s', $parts[1], $parts[2], $host, $parts[3]);
113
114 2
        return $dsn;
115
    }
116
}
117