Completed
Push — 5.1 ( af1a7b...f5b0b1 )
by Rémi
03:26
created

Wrapper::setProxies()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 23
rs 6.7272
cc 7
eloc 13
nc 12
nop 0
1
<?php
2
3
namespace Analogue\ORM\System\Wrappers;
4
5
use Analogue\ORM\System\InternallyMappable;
6
use Analogue\ORM\System\Proxies\EntityProxy;
7
use Analogue\ORM\System\Proxies\CollectionProxy;
8
9
/**
10
 * The Wrapper Class provides a single interface access several Entity types
11
 */
12
abstract class Wrapper implements InternallyMappable
13
{
14
    /**
15
     * Original Entity Object
16
     *
17
     * @var mixed
18
     */
19
    protected $entity;
20
21
    /**
22
     * Corresponding EntityMap
23
     *
24
     * @var \Analogue\ORM\EntityMap
25
     */
26
    protected $entityMap;
27
28
    /**
29
     * Wrapper constructor.
30
     * @param $entity
31
     * @param $entityMap
32
     */
33
    public function __construct($entity, $entityMap)
34
    {
35
        $this->entity = $entity;
36
        $this->entityMap = $entityMap;
37
    }
38
39
    /**
40
     * Return the wrapped entity class
41
     *
42
     * @return mixed
43
     */
44
    public function getEntityClass()
45
    {
46
        return get_class($this->entity);
47
    }
48
49
    /**
50
     * Returns the wrapped entity
51
     *
52
     * @return mixed
53
     */
54
    public function getObject()
55
    {
56
        return $this->entity;
57
    }
58
59
    /**
60
     * Returns the wrapped entity's map
61
     *
62
     * @return mixed
63
     */
64
    public function getMap()
65
    {
66
        return $this->entityMap;
67
    }
68
69
    /**
70
     * Set the lazyloading proxies on the wrapped entity objet
71
     *
72
     * @return void
73
     */
74
    public function setProxies()
75
    {
76
        $attributes = $this->getEntityAttributes();
77
        $singleRelations = $this->entityMap->getSingleRelationships();
78
        $manyRelations = $this->entityMap->getManyRelationships();
79
80
        $proxies = [];
81
82
        foreach ($this->entityMap->getRelationships() as $relation) {
83
            if (!array_key_exists($relation, $attributes) || is_null($attributes[$relation])) {
84
                if (in_array($relation, $singleRelations)) {
85
                    $proxies[$relation] = new EntityProxy($this->getObject(), $relation);
86
                }
87
                if (in_array($relation, $manyRelations)) {
88
                    $proxies[$relation] = new CollectionProxy($this->getObject(), $relation);
89
                }
90
            }
91
        }
92
93
        foreach ($proxies as $key => $value) {
94
            $this->setEntityAttribute($key, $value);
95
        }
96
    }
97
98
    /**
99
     * @param string $key
100
     * @param string $value
101
     * @return mixed
102
     */
103
    abstract public function setEntityAttribute($key, $value);
104
105
    /**
106
     * @param string $key
107
     * @return mixed
108
     */
109
    abstract public function getEntityAttribute($key);
110
111
    /**
112
     * @param array $attributes
113
     * @return mixed
114
     */
115
    abstract public function setEntityAttributes(array $attributes);
116
117
    /**
118
     * @return mixed
119
     */
120
    abstract public function getEntityAttributes();
121
122
    /**
123
     * @param string $key
124
     * @return mixed
125
     */
126
    abstract public function hasAttribute($key);
127
}
128