Passed
Push — master ( c93c78...d9ab06 )
by Anton
04:33 queued 02:57
created

src/Annotation/Relation/Relation.php (3 issues)

1
<?php declare(strict_types=1);
2
/**
3
 * Spiral Framework.
4
 *
5
 * @license   MIT
6
 * @author    Anton Titov (Wolfy-J)
7
 */
8
9
namespace Cycle\Annotated\Annotation\Relation;
10
11
use Spiral\Annotations\AnnotationInterface;
12
use Spiral\Annotations\Parser;
13
14
abstract class Relation implements RelationInterface, AnnotationInterface
15
{
16
    protected const NAME    = '';
17
    protected const OPTIONS = [
18
        'cascade'         => Parser::BOOL,
19
        'nullable'        => Parser::BOOL,
20
        'innerKey'        => Parser::STRING,
21
        'outerKey'        => Parser::STRING,
22
        'morphKey'        => Parser::STRING,
23
        'morphKeyLength'  => Parser::INTEGER,
24
        'though'          => Parser::STRING,
25
        'thoughInnerKey'  => Parser::STRING,
26
        'thoughOuterKey'  => Parser::STRING,
27
        'thoughConstrain' => Parser::STRING,
28
        'thoughWhere'     => [Parser::MIXED],
29
        'where'           => [Parser::MIXED],
30
        'fkCreate'        => Parser::BOOL,
31
        'fkAction'        => Parser::STRING,
32
        'indexCreate'     => Parser::BOOL,
33
    ];
34
35
    /** @var string|null */
36
    protected $target;
37
38
    /** @var Inverse|null */
39
    protected $inverse;
40
41
    /** @var array */
42
    protected $options = [];
43
44
    /**
45
     * Public and unique node name.
46
     *
47
     * @return string
48
     */
49
    public function getName(): string
50
    {
51
        return static::NAME;
52
    }
53
54
    /**
55
     * Return Node schema in a form of [name => Node|SCALAR|[Node]].
56
     *
57
     * @return array
58
     */
59
    public function getSchema(): array
60
    {
61
        $schema = static::OPTIONS + [
62
                'target'  => Parser::STRING,
63
                'inverse' => Inverse::class,
64
                'load'    => Parser::STRING,
65
                'fetch'   => Parser::STRING // alias to `load`
66
            ];
67
68
        array_walk_recursive($schema, function (&$v) {
69
            if (is_string($v) && class_exists($v)) {
70
                $v = new $v;
71
            }
72
        });
73
74
        return $schema;
75
    }
76
77
    /**
78
     * Set node attribute value.
79
     *
80
     * @param string $name
81
     * @param mixed  $value
82
     */
83
    public function setAttribute(string $name, $value)
84
    {
85
        if (in_array($name, ['target', 'inverse'])) {
86
            $this->{$name} = $value;
87
            return;
88
        }
89
90
        if (in_array($name, ['load', 'fetch'])) {
91
            $name = 'load';
92
        }
93
94
        $this->options[$name] = $value;
95
    }
96
97
    /**
98
     * @return string|null
99
     */
100
    public function getTarget(): ?string
101
    {
102
        return $this->target;
103
    }
104
105
    /**
106
     * @return array
107
     */
108
    public function getOptions(): array
109
    {
110
        return $this->options;
111
    }
112
113
    /**
114
     * @return string|null
115
     */
116
    public function getLoadMethod(): ?string
117
    {
118
        return $this->options['load'] ?? null;
119
    }
120
121
    /**
122
     * @return bool
123
     */
124
    public function isInversed(): bool
125
    {
126
        return $this->inverse !== null && $this->inverse->isValid();
127
    }
128
129
    /**
130
     * @return string
131
     */
132
    public function getInverseType(): string
133
    {
134
        return $this->inverse->getType();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->inverse->getType() could return the type null which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
The method getType() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

134
        return $this->inverse->/** @scrutinizer ignore-call */ getType();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
135
    }
136
137
    /**
138
     * @return string
139
     */
140
    public function getInverseName(): string
141
    {
142
        return $this->inverse->getRelation();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->inverse->getRelation() could return the type null which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
143
    }
144
145
    /**
146
     * @return int|null
147
     */
148
    public function getInverseLoadMethod(): ?int
149
    {
150
        return $this->inverse->getLoadMethod();
151
    }
152
153
}