Issues (6)

DoctrineOrm/Association/AssociationTreeBuilder.php (1 issue)

1
<?php
2
3
namespace Malef\Associate\DoctrineOrm\Association;
4
5
use Tree\Builder\NodeBuilder;
6
use Tree\Node\Node;
7
use Tree\Node\NodeInterface;
8
9
class AssociationTreeBuilder
10
{
11
    /**
12
     * @var NodeBuilder
13
     */
14
    protected $nodeBuilder;
15
16
    /**
17
     * @var NodeInterface
18
     */
19
    protected $rootNode;
20
21
    /**
22
     * @var bool
23
     */
24
    protected $isAllowedToAlterAssociation;
25
26
    /**
27
     * @var NodeInterface[]
28
     */
29
    protected $divergeNodes = [];
30
31
    public function __construct()
32
    {
33
        $this->rootNode = new Node();
34
        $this->isAllowedToAlterAssociation = false;
35
        $this->nodeBuilder = new NodeBuilder($this->rootNode);
36
    }
37
38
    /**
39
     * @throws \Exception
40
     */
41
    public function associate(string $relationshipName): self
42
    {
43
        $this->nodeBuilder->tree(new Association($relationshipName));
44
        $this->isAllowedToAlterAssociation = true;
45
46
        return $this;
47
    }
48
49
    public function diverge(): self
50
    {
51
        $this->divergeNodes[] = $this->nodeBuilder->getNode();
52
        $this->isAllowedToAlterAssociation = false;
53
54
        return $this;
55
    }
56
57
    /**
58
     * @throws \Exception
59
     */
60
    public function endDiverge(): self
61
    {
62
        if (!$this->divergeNodes) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->divergeNodes of type Tree\Node\NodeInterface[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
63
            throw new \Exception();
64
        }
65
66
        $lastDivergeNode = array_pop($this->divergeNodes);
67
        while ($this->nodeBuilder->getNode() !== $lastDivergeNode) {
68
            $this->nodeBuilder->end();
69
        }
70
        $this->isAllowedToAlterAssociation = false;
71
72
        return $this;
73
    }
74
75
    public function create(): AssociationTree
76
    {
77
        return new AssociationTree($this->rootNode);
78
    }
79
}
80