-
Notifications
You must be signed in to change notification settings - Fork 671
/
BaseObject.php
132 lines (115 loc) · 2.7 KB
/
BaseObject.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php
namespace Telegram\Bot\Objects;
use Illuminate\Support\Collection;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
/**
* Class BaseObject.
*/
abstract class BaseObject extends Collection
{
/**
* Builds collection entity.
*
* @param array|mixed $data
*/
public function __construct($data)
{
parent::__construct($this->getRawResult($data));
$this->mapRelatives();
}
/**
* Property relations.
*
* @return array
*/
abstract public function relations();
/**
* Get an item from the collection by key.
*
* @param mixed $key
* @param mixed $default
*
* @return mixed|static
*/
public function get($key, $default = null)
{
if ($this->offsetExists($key)) {
return is_array($this->items[$key]) ? new static($this->items[$key]) : $this->items[$key];
}
return value($default);
}
/**
* Map property relatives to appropriate objects.
*
* @return array|void
*/
public function mapRelatives()
{
$relations = collect($this->relations());
if ($relations->isEmpty()) {
return false;
}
return $this->items = collect($this->all())
->map(function ($value, $key) use ($relations) {
if (!$relations->has($key)) {
return $value;
}
$className = $relations->get($key);
return new $className($value);
})
->all();
}
/**
* Returns raw response.
*
* @return array|mixed
*/
public function getRawResponse()
{
return $this->items;
}
/**
* Returns raw result.
*
* @param $data
*
* @return mixed
*/
public function getRawResult($data)
{
return Arr::get($data, 'result', $data);
}
/**
* Get Status of request.
*
* @return mixed
*/
public function getStatus()
{
return Arr::get($this->items, 'ok', false);
}
/**
* Magic method to get properties dynamically.
*
* @param $name
* @param $arguments
*
* @return mixed
*/
public function __call($name, $arguments)
{
$action = substr($name, 0, 3);
if ($action !== 'get') {
return false;
}
$property = Str::snake(substr($name, 3));
$response = $this->get($property);
// Map relative property to an object
$relations = $this->relations();
if (null != $response && isset($relations[$property])) {
return new $relations[$property]($response);
}
return $response;
}
}