-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathModelAbstract.php
140 lines (106 loc) · 2.74 KB
/
ModelAbstract.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
133
134
135
136
137
138
139
140
<?php
namespace Greg\Orm;
use Greg\Orm\Connection\ConnectionStrategy;
abstract class ModelAbstract implements \Serializable
{
use TableTrait;
/**
* @var ConnectionStrategy|null
*/
private $connection;
public function __construct(ConnectionStrategy $connection)
{
$this->connection = $connection;
$this->boot();
$this->bootTraits();
return $this;
}
public function setConnection(ConnectionStrategy $strategy)
{
$this->connection = $strategy;
return $this;
}
public function getConnection(): ?ConnectionStrategy
{
return $this->connection;
}
public function connection(): ConnectionStrategy
{
if (!$this->connection) {
throw new \Exception('Model connection is not defined.');
}
return $this->connection;
}
public function cleanup()
{
$this->query = null;
$this->clauses = [];
return $this;
}
/**
* @return $this
*/
public function cleanClone()
{
/*
* New instance is much faster then clone in php 7.1
*
$cloned = clone $this;
$cloned->cleanup();
*/
$cloned = new static($this->connection);
$this->transferAppliersTo($cloned);
return $cloned;
}
public function serialize()
{
return serialize([
$this->alias,
$this->primaryKey,
$this->autoIncrement,
$this->uniqueKeys,
]);
}
public function unserialize($serialized)
{
[
$this->alias,
$this->primaryKey,
$this->autoIncrement,
$this->uniqueKeys,
] = unserialize($serialized);
}
protected function boot()
{
return $this;
}
private function bootTraits()
{
foreach ($this->usesRecursive(static::class, self::class) as $trait) {
$baseName = (new \ReflectionClass($trait))->getShortName();
if (method_exists($this, $method = 'boot' . $baseName)) {
call_user_func_array([$this, $method], []);
}
}
return $this;
}
private function uses($class)
{
$traits = class_uses($class);
foreach ($traits as $trait) {
$traits += $this->uses($trait);
}
return array_unique($traits);
}
private function usesRecursive($class, $breakOn = null)
{
$results = [];
foreach (array_merge([$class => $class], class_parents($class)) as $class) {
if ($breakOn === $class) {
break;
}
$results += $this->uses($class);
}
return array_unique($results);
}
}