Completed
Push — develop ( 72ec54...8ecd83 )
by Nate
02:28
created

Accessor   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 162
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 16
lcom 1
cbo 5
dl 0
loc 162
ccs 0
cts 75
cp 0
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
objectClass() 0 1 ?
A objectClassInstance() 0 4 1
A prepareConfigFromRecord() 0 7 1
A create() 0 15 3
A prepareConfig() 0 10 2
A find() 0 9 2
A queryOne() 0 6 1
A queryAll() 0 6 1
A createFromQueryResult() 0 8 2
A createAllFromQueryResults() 0 9 2
A notFoundException() 0 8 1
1
<?php
2
3
/**
4
 * @copyright  Copyright (c) Flipbox Digital Limited
5
 * @license    https://github.com/flipboxfactory/craft-ember/blob/master/LICENSE
6
 * @link       https://github.com/flipboxfactory/craft-ember
7
 */
8
9
namespace flipbox\ember\services\traits\objects;
10
11
use craft\helpers\ArrayHelper;
12
use flipbox\ember\exceptions\ObjectNotFoundException;
13
use flipbox\ember\helpers\ObjectHelper;
14
use flipbox\ember\services\traits\queries\Accessor as QueryAccessor;
15
use yii\base\BaseObject;
16
use yii\db\ActiveRecord as Record;
17
use yii\db\QueryInterface;
18
19
/**
20
 * Used when an object configuration is stored in the database and upon it's retrieval, an object is
21
 * created and returned. Instances when the class name is stored at the record level, leave the static::objectClass()
22
 * null and the records 'type' or 'class' property will be used.
23
 *
24
 * @author Flipbox Factory <[email protected]>
25
 * @since 1.0.0
26
 *
27
 * @method BaseObject parentQueryOne(QueryInterface $query)
28
 * @method BaseObject[] parentQueryAll(QueryInterface $query)
29
 */
30
trait Accessor
31
{
32
    use QueryAccessor {
33
        queryOne as parentQueryOne;
34
        queryAll as parentQueryAll;
35
    }
36
37
    /*******************************************
38
     * OBJECT CLASSES
39
     *******************************************/
40
41
    /**
42
     * @return string|null
43
     */
44
    abstract public static function objectClass();
45
46
    /**
47
     * @return string
48
     */
49
    public static function objectClassInstance(): string
50
    {
51
        return BaseObject::class;
52
    }
53
54
    /*******************************************
55
     * CREATE
56
     *******************************************/
57
58
    /**
59
     * @param mixed $config
60
     * @return BaseObject
61
     * @throws \yii\base\InvalidConfigException
62
     */
63
    public function create($config = [])
64
    {
65
        if ($config instanceof Record) {
66
            $config = $this->prepareConfigFromRecord($config);
67
        }
68
69
        if (!is_array($config)) {
70
            $config = ArrayHelper::toArray($config, [], false);
71
        }
72
73
        return ObjectHelper::create(
74
            $this->prepareConfig($config),
75
            static::objectClassInstance()
76
        );
77
    }
78
79
    /**
80
     * @param array $config
81
     * @return array
82
     */
83
    protected function prepareConfig(array $config = []): array
84
    {
85
        // Auto-set the class
86
        $class = static::objectClass();
87
        if ($class !== null) {
88
            $config['class'] = $class;
89
        }
90
91
        return $config;
92
    }
93
94
    /**
95
     * @param Record $record
96
     * @return array
97
     */
98
    protected function prepareConfigFromRecord(Record $record): array
99
    {
100
        return array_merge(
101
            $record->getRelatedRecords(),
102
            $record->toArray()
103
        );
104
    }
105
106
    /*******************************************
107
     * FIND / GET
108
     *******************************************/
109
110
    /**
111
     * @inheritdoc
112
     */
113
    public function find($identifier)
114
    {
115
        $instance = static::objectClassInstance();
116
        if ($identifier instanceof $instance) {
117
            return $identifier;
118
        }
119
120
        return $this->findByCondition($identifier);
121
    }
122
123
    /*******************************************
124
     * CACHE
125
     *******************************************/
126
127
    /**
128
     * @inheritdoc
129
     * @throws \yii\base\InvalidConfigException
130
     */
131
    protected function queryOne(QueryInterface $query)
132
    {
133
        return $this->createFromQueryResult(
134
            $this->parentQueryOne($query)
135
        );
136
    }
137
138
    /**
139
     * @inheritdoc
140
     * @throws \yii\base\InvalidConfigException
141
     */
142
    protected function queryAll(QueryInterface $query)
143
    {
144
        return $this->createAllFromQueryResults(
145
            $this->parentQueryAll($query)
146
        );
147
    }
148
149
    /**
150
     * @param $result
151
     * @return null|BaseObject
152
     */
153
    protected function createFromQueryResult($result)
154
    {
155
        if ($result === null) {
156
            return null;
157
        }
158
159
        return $this->create($result);
160
    }
161
162
    /**
163
     * @param array $results
164
     * @return array
165
     */
166
    protected function createAllFromQueryResults(array $results): array
167
    {
168
        $objects = [];
169
        foreach ($results as $key => $value) {
170
            $objects[$key] = $this->create($value);
171
        }
172
173
        return $objects;
174
    }
175
176
    /*******************************************
177
     * EXCEPTIONS
178
     *******************************************/
179
180
    /**
181
     * @throws ObjectNotFoundException
182
     */
183
    protected function notFoundException()
184
    {
185
        throw new ObjectNotFoundException(
186
            sprintf(
187
                "Object not found."
188
            )
189
        );
190
    }
191
}
192