Passed
Push — master ( 3d85c1...365911 )
by Peter
02:26
created

FileFinderBootstrapper   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 10
eloc 33
c 1
b 0
f 0
dl 0
loc 86
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getDbDriver() 0 22 5
A registerMigrationFileFinder() 0 16 2
A registerBindings() 0 4 1
A getBindings() 0 5 1
A registerDefaultFileFinder() 0 6 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Admin\Bootstrappers\Filesystem;
6
7
use AbterPhp\Framework\Constant\Env;
8
use AbterPhp\Framework\Filesystem\FileFinder;
9
use AbterPhp\Framework\Filesystem\IFileFinder;
10
use AbterPhp\Framework\Module\Manager; // @phan-suppress-current-line PhanUnreferencedUseNormal
11
use League\Flysystem\Adapter\Local;
12
use League\Flysystem\Filesystem;
13
use Opulence\Databases\Adapters\Pdo\MySql\Driver as MySqlDriver;
14
use Opulence\Databases\Adapters\Pdo\PostgreSql\Driver as PostgreSqlDriver;
15
use Opulence\Environments\Environment;
16
use Opulence\Ioc\Bootstrappers\Bootstrapper;
17
use Opulence\Ioc\Bootstrappers\ILazyBootstrapper;
18
use Opulence\Ioc\IContainer;
19
20
class FileFinderBootstrapper extends Bootstrapper implements ILazyBootstrapper
21
{
22
    const MIGRATION_FILE_FINDER = 'MigrationFileFinder';
23
24
    /** @var string|null */
25
    protected $dbDriverName;
26
27
    /**
28
     * @return array
29
     */
30
    public function getBindings(): array
31
    {
32
        return [
33
            IFileFinder::class,
34
            static::MIGRATION_FILE_FINDER,
35
        ];
36
    }
37
38
    /**
39
     * @param IContainer $container
40
     *
41
     * @throws \Opulence\Ioc\IocException
42
     */
43
    public function registerBindings(IContainer $container)
44
    {
45
        $this->registerDefaultFileFinder($container);
46
        $this->registerMigrationFileFinder($container);
47
    }
48
49
    /**
50
     * @param IContainer $container
51
     */
52
    protected function registerDefaultFileFinder(IContainer $container)
53
    {
54
        /** @var IFileFinder $fileFinder */
55
        $fileFinder = new FileFinder();
56
57
        $container->bindInstance(IFileFinder::class, $fileFinder);
58
    }
59
60
    /**
61
     * @param IContainer $container
62
     */
63
    protected function registerMigrationFileFinder(IContainer $container)
64
    {
65
        /** @var Manager $abterModuleManager */
66
        global $abterModuleManager;
67
68
        $dbDriver   = $this->getDbDriver();
69
        $fileFinder = new FileFinder();
70
        foreach ($abterModuleManager->getResourcePaths() as $resourcePath) {
71
            $path    = sprintf('%s%s%s', $resourcePath, DIRECTORY_SEPARATOR, $dbDriver);
72
            $adapter = new Local($path);
73
            $fs      = new Filesystem($adapter);
74
75
            $fileFinder->registerFilesystem($fs);
76
        }
77
78
        $container->bindInstance(static::MIGRATION_FILE_FINDER, $fileFinder);
79
    }
80
81
    /**
82
     * @return string
83
     */
84
    protected function getDbDriver(): string
85
    {
86
        if ($this->dbDriverName !== null) {
87
            return $this->dbDriverName;
88
        }
89
90
        $driverClass = Environment::getVar(Env::DB_DRIVER) ?: PostgreSqlDriver::class;
91
92
        switch ($driverClass) {
93
            case MySqlDriver::class:
94
                $this->dbDriverName = 'mysql';
95
                break;
96
            case PostgreSqlDriver::class:
97
                $this->dbDriverName = 'pgsql';
98
                break;
99
            default:
100
                throw new \RuntimeException(
101
                    "Invalid database driver type specified in environment var \"DB_DRIVER\": $driverClass"
102
                );
103
        }
104
105
        return $this->dbDriverName;
106
    }
107
}
108