Completed
Push — 1.x ( 8d261c...0c6c70 )
by Akihito
12s queued 10s
created

CompilePreload::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 5
1
<?php
2
3
declare(strict_types=1);
4
5
namespace BEAR\Package\Compiler;
6
7
use ArrayObject;
8
use BEAR\AppMeta\AbstractAppMeta;
9
use BEAR\AppMeta\Meta;
10
11
use function realpath;
12
use function sprintf;
13
14
final class CompilePreload
15
{
16
    /** @var NewInstance */
17
    private $newInstance;
18
19
    /** @var CompileAutoload */
20
    private $dumpAutoload;
21
22
    /** @var ArrayObject<int, string> */
23
    private $classes;
24
25
    /** @var FilePutContents */
26
    private $filePutContents;
27
28
    /** @var string */
29
    private $context;
30
31
    /**
32
     * @param ArrayObject<int, string> $classes
33
     */
34
    public function __construct(NewInstance $newInstance, CompileAutoload $dumpAutoload, FilePutContents $filePutContents, ArrayObject $classes, string $context)
35
    {
36
        $this->newInstance = $newInstance;
37
        $this->dumpAutoload = $dumpAutoload;
38
        $this->classes = $classes;
39
        $this->filePutContents = $filePutContents;
40
        $this->context = $context;
41
    }
42
43
    public function __invoke(AbstractAppMeta $appMeta, string $context): string
44
    {
45
        $this->loadResources($appMeta->name, $context, $appMeta->appDir);
46
        /** @var list<string> $classes */
0 ignored issues
show
Documentation introduced by
The doc-type list<string> could not be parsed: Expected "|" or "end of type", but got "<" at position 4. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
47
        $classes = (array) $this->classes;
48
        $paths = $this->dumpAutoload->getPaths($classes);
49
        $requiredOnceFile = '';
50
        foreach ($paths as $path) {
51
            $requiredOnceFile .= sprintf(
52
                "require_once %s';\n",
53
                $path
54
            );
55
        }
56
57
        $preloadFile = sprintf("<?php
58
59
// %s preload
60
61
require __DIR__ . '/vendor/autoload.php';
62
63
%s", $this->context, $requiredOnceFile);
64
        $fileName = realpath($appMeta->appDir) . '/preload.php';
65
        ($this->filePutContents)($fileName, $preloadFile);
66
67
        return $fileName;
68
    }
69
70
    public function loadResources(string $appName, string $context, string $appDir): void
71
    {
72
        $meta = new Meta($appName, $context, $appDir);
73
74
        $resMetas = $meta->getGenerator('*');
75
        foreach ($resMetas as $resMeta) {
76
            ($this->newInstance)($resMeta->class);
77
        }
78
    }
79
}
80