CreateRelationAction::endOfClass()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
namespace Mtolhuys\LaravelSchematics\Actions\Relation;
4
5
use Illuminate\Support\Facades\File;
6
use ReflectionException;
7
use ReflectionClass;
8
9
class CreateRelationAction
10
{
11
    /**
12
     * @param $request
13
     * @return object
14
     * @throws ReflectionException
15
     */
16
    public function execute($request)
17
    {
18
        $source = $request['source'];
19
        $stub = __DIR__ . '/../../../resources/stubs/relation.stub';
20
        $file = (new ReflectionClass($source))->getFileName();
21
        $lines = file($file, FILE_IGNORE_NEW_LINES);
22
23
        $injectionLine = $this->endOfClass($file) - 1;
24
25
        $lines[$injectionLine] = PHP_EOL . $this->generateMethod($request, $stub) . '}';
26
27
        file_put_contents($file, implode("\n", $lines));
28
29
        return (object)[
30
            'file' => $file,
31
            'line' => ($injectionLine + count(file($stub)) - 2),
32
        ];
33
    }
34
35
    /**
36
     * @param $request
37
     * @param string $stub
38
     * @return string|string[]
39
     * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
40
     */
41
    private function generateMethod($request, string $stub)
42
    {
43
        $modelAsClass = json_decode($request['options']['hasModelAsClass'], false);
44
45
        $replace = [
46
            '$target$' => $modelAsClass ? "\\{$request['target']}::class" : "'{$request['target']}'",
47
            '$method$' => $request['method']['name'],
48
            '$type$' => lcfirst($request['type']),
49
            '$keys$' => $request['keys'] ?? '',
50
            '$class$' => $request['type'],
51
        ];
52
53
        return str_replace(
54
            array_keys($replace),
55
            array_values($replace),
56
            File::get($stub)
57
        );
58
    }
59
60
    /**
61
     * @param $file
62
     * @return int|string|null
63
     */
64
    private function endOfClass($file)
65
    {
66
        $lines = preg_split("/\r\n|\n|\r/", file_get_contents($file));
67
        $lastOccurrence = null;
68
69
        foreach ($lines as $index => $line) {
70
            if (strpos(trim($line), '}') !== false) {
71
                $lastOccurrence = $index + 1;
72
            }
73
        }
74
75
        return $lastOccurrence;
76
    }
77
}
78