Passed
Push — master ( adedda...939319 )
by Jonas
12:49
created

DeepRelationsHook   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Test Coverage

Coverage 96.97%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 33
c 1
b 0
f 0
dl 0
loc 50
ccs 32
cts 33
cp 0.9697
rs 10
wmc 9

1 Method

Rating   Name   Duplication   Size   Complexity  
B run() 0 48 9
1
<?php
2
3
namespace Staudenmeir\EloquentHasManyDeep\IdeHelper;
4
5
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
6
use Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface;
7
use Exception;
8
use Illuminate\Database\Eloquent\Collection;
9
use Illuminate\Database\Eloquent\Model;
10
use Illuminate\Support\Str;
11
use ReflectionClass;
12
use ReflectionMethod;
13
use Staudenmeir\EloquentHasManyDeep\HasManyDeep;
14
use Staudenmeir\EloquentHasManyDeep\HasOneDeep;
15
use Staudenmeir\EloquentHasManyDeep\HasRelationships;
16
17
class DeepRelationsHook implements ModelHookInterface
18
{
19 2
    public function run(ModelsCommand $command, Model $model): void
20
    {
21 2
        $traits = class_uses_recursive($model);
22
23 2
        if (!in_array(HasRelationships::class, $traits)) {
24
            return;
25
        }
26
27 2
        $methods = (new ReflectionClass($model))->getMethods(ReflectionMethod::IS_PUBLIC);
28
29 2
        foreach ($methods as $method) {
30 2
            if ($method->isStatic() || $method->getNumberOfParameters() > 0) {
31 2
                continue;
32
            }
33
34
            try {
35 2
                $relation = $method->invoke($model);
36 2
            } catch (Exception) {
37 2
                continue;
38
            }
39
40 2
            if (!$relation instanceof HasManyDeep) {
41 2
                continue;
42
            }
43
44 2
            $isHasOneDeep = $relation instanceof HasOneDeep;
45
46 2
            $type = $isHasOneDeep
47 2
                ? '\\' . $relation->getRelated()::class
48 2
                : '\\' . Collection::class . '|\\' . $relation->getRelated()::class . '[]';
49
50 2
            $command->setProperty(
51 2
                $method->getName(),
52 2
                $type,
53 2
                true,
54 2
                false,
55 2
                '',
56 2
                $isHasOneDeep
57 2
            );
58
59 2
            if (!$isHasOneDeep) {
60 2
                $command->setProperty(
61 2
                    Str::snake($method->getName()) . '_count',
62 2
                    'int',
63 2
                    true,
64 2
                    false,
65 2
                    null,
66 2
                    true
67 2
                );
68
            }
69
        }
70
    }
71
}
72