ModelEvent.php
6.0 KB
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace think\model\concern;
use think\Container;
use think\Loader;
/**
* 模型事件处理
*/
trait ModelEvent
{
/**
* 模型回调
* @var array
*/
private static $event = [];
/**
* 模型事件观察
* @var array
*/
protected static $observe = ['before_write', 'after_write', 'before_insert', 'after_insert', 'before_update', 'after_update', 'before_delete', 'after_delete', 'before_restore', 'after_restore'];
/**
* 绑定模型事件观察者类
* @var array
*/
protected $observerClass;
/**
* 是否需要事件响应
* @var bool
*/
private $withEvent = true;
/**
* 注册回调方法
* @access public
* @param string $event 事件名
* @param callable $callback 回调方法
* @param bool $override 是否覆盖
* @return void
*/
public static function event($event, $callback, $override = false)
{
$class = static::class;
if ($override) {
self::$event[$class][$event] = [];
}
self::$event[$class][$event][] = $callback;
}
/**
* 清除回调方法
* @access public
* @return void
*/
public static function flushEvent()
{
self::$event[static::class] = [];
}
/**
* 注册一个模型观察者
*
* @param object|string $class
* @return void
*/
public static function observe($class)
{
foreach (static::$observe as $event) {
$eventFuncName = Loader::parseName($event, 1, false);
if (method_exists($class, $eventFuncName)) {
static::event($event, [$class, $eventFuncName]);
}
}
}
/**
* 当前操作的事件响应
* @access protected
* @param bool $event 是否需要事件响应
* @return $this
*/
public function withEvent($event)
{
$this->withEvent = $event;
return $this;
}
/**
* 触发事件
* @access protected
* @param string $event 事件名
* @return bool
*/
protected function trigger($event)
{
$class = static::class;
if ($this->withEvent && isset(self::$event[$class][$event])) {
foreach (self::$event[$class][$event] as $callback) {
$result = Container::getInstance()->invoke($callback, [$this]);
if (false === $result) {
return false;
}
}
}
return true;
}
/**
* 模型before_insert事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function beforeInsert($callback, $override = false)
{
self::event('before_insert', $callback, $override);
}
/**
* 模型after_insert事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function afterInsert($callback, $override = false)
{
self::event('after_insert', $callback, $override);
}
/**
* 模型before_update事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function beforeUpdate($callback, $override = false)
{
self::event('before_update', $callback, $override);
}
/**
* 模型after_update事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function afterUpdate($callback, $override = false)
{
self::event('after_update', $callback, $override);
}
/**
* 模型before_write事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function beforeWrite($callback, $override = false)
{
self::event('before_write', $callback, $override);
}
/**
* 模型after_write事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function afterWrite($callback, $override = false)
{
self::event('after_write', $callback, $override);
}
/**
* 模型before_delete事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function beforeDelete($callback, $override = false)
{
self::event('before_delete', $callback, $override);
}
/**
* 模型after_delete事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function afterDelete($callback, $override = false)
{
self::event('after_delete', $callback, $override);
}
/**
* 模型before_restore事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function beforeRestore($callback, $override = false)
{
self::event('before_restore', $callback, $override);
}
/**
* 模型after_restore事件快捷方法
* @access protected
* @param callable $callback
* @param bool $override
*/
protected static function afterRestore($callback, $override = false)
{
self::event('after_restore', $callback, $override);
}
}