DatabaseFactory   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 55
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 14
c 1
b 0
f 0
dl 0
loc 55
rs 10
wmc 7

6 Methods

Rating   Name   Duplication   Size   Complexity  
A build() 0 5 1
A __construct() 0 3 2
A createModelManager() 0 3 1
A createConnection() 0 3 1
A createConfig() 0 3 1
A wireContainer() 0 9 1
1
<?php
2
3
/*
4
 * This file is part of the Scrawler package.
5
 *
6
 * (c) Pranjal Pandey <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Scrawler\Arca\Factory;
13
14
use Doctrine\DBAL\Connection;
15
use Doctrine\DBAL\DriverManager;
16
use Scrawler\Arca\Config;
17
use Scrawler\Arca\Database;
18
use Scrawler\Arca\Manager\ModelManager;
19
20
class DatabaseFactory
21
{
22
    private readonly \DI\Container $container;
23
24
    public function __construct(?\DI\Container $container = null)
25
    {
26
        $this->container = is_null($container) ? new \DI\Container() : $container;
0 ignored issues
show
Bug introduced by
The property container is declared read-only in Scrawler\Arca\Factory\DatabaseFactory.
Loading history...
27
    }
28
29
    /**
30
     * Create a new Database instance.
31
     *
32
     * @param array<mixed> $connectionParams
33
     */
34
    public function build(array $connectionParams): Database
35
    {
36
        $this->wireContainer($connectionParams);
37
38
        return $this->container->make(Database::class);
39
    }
40
41
    /**
42
     * Create a new Database instance.
43
     *
44
     * @param array<mixed> $connectionParams
45
     */
46
    public function wireContainer(array $connectionParams): void
47
    {
48
        $useUUID = $connectionParams['useUUID'] ?? false;
49
        $modelNamespace = $connectionParams['modelNamespace'] ?? '';
50
51
        $this->createConfig($useUUID, $modelNamespace);
52
        unset($connectionParams['useUUID'], $connectionParams['modelNamespace']);
53
        $this->createConnection($connectionParams);
54
        $this->createModelManager();
55
    }
56
57
    /**
58
     * Create a new connection.
59
     *
60
     * @param array<mixed> $connectionParams
61
     */
62
    private function createConnection(array $connectionParams): void
63
    {
64
        $this->container->set(Connection::class, fn (): Connection => DriverManager::getConnection($connectionParams));
65
    }
66
67
    private function createModelManager(): void
68
    {
69
        $this->container->set(ModelManager::class, fn (): ModelManager => new ModelManager($this->container, $this->container->get(Config::class)));
70
    }
71
72
    private function createConfig(bool $useUUID, string $modelNamespace): void
73
    {
74
        $this->container->set(Config::class, fn (): Config => new Config($useUUID, $modelNamespace));
75
    }
76
}
77