Attribute::with()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
1
<?php
2
3
/*
4
 * This file is part of the light/easemob.
5
 *
6
 * (c) lichunqiang <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace light\Easemob\Support;
13
14
use light\Easemob\Exception\InvalidArgumentException;
15
16
/**
17
 * Class Attributes.
18
 */
19
abstract class Attribute extends Collection
20
{
21
    /**
22
     * Attributes alias.
23
     *
24
     * @var array
25
     */
26
    protected $aliases = [];
27
28
    /**
29
     * Required attributes.
30
     *
31
     * @var array
32
     */
33
    protected $requireds = [];
34
35
    /**
36
     * Constructor.
37
     *
38
     * @param array $attributes
39
     */
40
    public function __construct($attributes = [])
41
    {
42
        parent::__construct($attributes);
43
    }
44
45
    /**
46
     * Set attribute.
47
     *
48
     * @param string $attribute
49
     * @param string $value
50
     *
51
     * @return Attribute
52
     */
53
    public function setAttribute($attribute, $value)
54
    {
55
        $this->add($attribute, $value);
56
57
        return $this;
58
    }
59
60
    /**
61
     * Get attribute.
62
     *
63
     * @param string $attribute
64
     * @param mixed  $default
65
     *
66
     * @return mixed
67
     */
68
    public function getAttribute($attribute, $default)
69
    {
70
        return $this->get($attribute, $default);
71
    }
72
73
    /**
74
     * Set attribute.
75
     *
76
     * @param string $attribute
77
     * @param mixed  $value
78
     *
79
     * @return Attribute
80
     */
81
    public function with($attribute, $value)
82
    {
83
        if (!$this->validate($attribute, $value)) {
84
            throw new InvalidArgumentException("Invalid attribute '{$attribute}'.");
85
        }
86
87
        $this->set($attribute, $value);
88
89
        return $this;
90
    }
91
92
    /**
93
     * Attribute validation.
94
     *
95
     * @param string $attribute
96
     * @param mixed  $value
97
     *
98
     * @return bool
99
     */
100
    protected function validate($attribute, $value)
0 ignored issues
show
Unused Code introduced by
The parameter $attribute is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $value is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
101
    {
102
        return true;
103
    }
104
105
    /**
106
     * Override parent set() method.
107
     *
108
     * @param string $attribute
109
     * @param mixed  $value
110
     */
111
    public function set($attribute, $value = null)
112
    {
113
        return parent::set($this->getRealKey($attribute), $value);
114
    }
115
116
    /**
117
     * Override parent get() method.
118
     *
119
     * @param string $attribute
120
     * @param mixed  $default
121
     *
122
     * @return mixed
123
     */
124
    public function get($attribute, $default = null)
125
    {
126
        return parent::get($this->getRealKey($attribute), $default);
127
    }
128
129
    /**
130
     * Magic call.
131
     *
132
     * @param string $method
133
     * @param array  $args
134
     *
135
     * @return Attribute
136
     */
137
    public function __call($method, $args)
138
    {
139
        if (stripos($method, 'with') === 0) {
140
            $method = substr($method, 4);
141
        }
142
143
        return $this->with($method, array_shift($args));
144
    }
145
146
    /**
147
     * Magic set.
148
     *
149
     * @param string $property
150
     * @param mixed  $value
151
     *
152
     * @return Attribute
153
     */
154
    public function __set($property, $value)
155
    {
156
        return $this->with($property, $value);
157
    }
158
159
    /**
160
     * Whether or not an data exists by key.
161
     *
162
     * @param string $key
163
     *
164
     * @return bool
165
     */
166
    public function __isset($key)
167
    {
168
        return parent::__isset($this->getRealKey($key));
169
    }
170
171
    /**
172
     * Return the raw name of attribute.
173
     *
174
     * @param string $key
175
     *
176
     * @return string
177
     */
178
    protected function getRealKey($key)
179
    {
180
        if ($alias = array_search($key, $this->aliases, true)) {
181
            $key = $alias;
182
        }
183
184
        return $key;
185
    }
186
187
    /**
188
     * Check required attributes.
189
     *
190
     * @throws InvalidArgumentException
191
     */
192
    protected function checkRequiredAttributes()
193
    {
194
        foreach ($this->requireds as $attribute) {
195
            if (!isset($this->$attribute)) {
196
                throw new InvalidArgumentException(" '{$attribute}' cannot be empty.");
197
            }
198
        }
199
    }
200
201
    /**
202
     * Return all items.
203
     *
204
     * @throws InvalidArgumentException
205
     *
206
     * @return array
207
     */
208
    public function all()
209
    {
210
        $this->checkRequiredAttributes();
211
212
        return parent::all();
213
    }
214
}
215