Instantiator::run()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 2
nop 0
dl 0
loc 12
rs 10
c 0
b 0
f 0
1
<?php
2
3
4
namespace Quantick\DeployMigration\Lib\Service;
5
6
7
use Quantick\DeployMigration\Lib\DeployMigration;
8
use Symfony\Component\Finder\SplFileInfo;
9
10
class Instantiator
11
{
12
    /**
13
     * @var array
14
     */
15
    private $migrationFiles;
16
17
    /**
18
     * MigrationInstantiator constructor.
19
     * @param array|SplFileInfo[] $migrationFiles
20
     */
21
    private function __construct(array $migrationFiles)
22
    {
23
        $this->migrationFiles = $migrationFiles;
24
    }
25
26
    public static function create(array $migrationFiles = [])
27
    {
28
        return new static($migrationFiles);
29
    }
30
31
    /**
32
     * @throws \ReflectionException
33
     */
34
    public function run(): MigrationCollection
35
    {
36
        $migrationCollection = MigrationCollection::create();
37
38
        foreach ($this->migrationFiles as $migrationFile) {
39
            $this->requireMigration($migrationFile);
40
            $migration = $this->instantiateMigration($this->parseClassName($migrationFile));
41
42
            $migrationCollection->addMigration($migration);
43
        }
44
45
        return $migrationCollection;
46
    }
47
48
    /**
49
     * @param SplFileInfo $fileInfo
50
     */
51
    private function requireMigration(SplFileInfo $fileInfo): void
52
    {
53
        require_once $fileInfo->getPathname();
54
    }
55
56
    /**
57
     * @param string $migrationClass
58
     * @return DeployMigration
59
     * @throws \ReflectionException
60
     */
61
    private function instantiateMigration(string $migrationClass)
62
    {
63
        $migrationReflection = new \ReflectionClass($migrationClass);
64
        /** @var DeployMigration $instance */
65
        $instance = $migrationReflection->newInstance();
66
        return $instance;
67
    }
68
69
    /**
70
     * @param SplFileInfo $fileInfo
71
     * @return string
72
     */
73
    private function parseClassName(SplFileInfo $fileInfo)
74
    {
75
        return basename($fileInfo->getPathname(), '.php');
76
    }
77
78
}