Repository navigation
Expand file tree
/
Copy pathAppleEventHandler.php
More file actions
98 lines (87 loc) · 2.91 KB
/
Copy pathAppleEventHandler.php
File metadata and controls
98 lines (87 loc) · 2.91 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
<?php
namespace common\handlers;
use Yii;
use common\models\Apple;
use yii\base\Event;
use yii\base\Component;
use yii\base\BootstrapInterface;
/**
* Обработчик событий модели Apple
*
* Обрабатывает события жизненного цикла яблока:
* - appleFallen - когда яблоко падает с дерева
* - appleRotten - когда яблоко испортилось
*/
class AppleEventHandler extends Component implements BootstrapInterface
{
/**
* Bootstrap method для автоматической регистрации обработчиков
* @param \yii\base\Application $app
*/
public function bootstrap($app)
{
self::register();
}
/**
* Обработчик события падения яблока
*
* @param Event $event
*/
public static function onAppleFallen(Event $event)
{
/** @var Apple $apple */
$apple = $event->sender;
Yii::info([
'event' => 'apple_fallen',
'apple_id' => $apple->id,
'color' => $apple->color,
'created_at' => $apple->created_at,
'fell_at' => $apple->fell_at,
'time_on_tree' => $apple->fell_at - $apple->created_at,
], 'apple_events');
// Здесь можно добавить дополнительную логику:
// - отправку уведомлений
// - запись в отдельную таблицу событий
// - обновление метрик в реальном времени
// - webhook вызовы
}
/**
* Обработчик события порчи яблока
*
* @param Event $event
*/
public static function onAppleRotten(Event $event)
{
/** @var Apple $apple */
$apple = $event->sender;
$timeOnGround = time() - $apple->fell_at;
Yii::info([
'event' => 'apple_rotten',
'apple_id' => $apple->id,
'color' => $apple->color,
'fell_at' => $apple->fell_at,
'time_on_ground' => $timeOnGround,
'eaten_percent' => $apple->eaten_percent,
], 'apple_events');
// Здесь можно добавить:
// - уведомление о порче
// - автоматическое удаление через определенное время
// - сохранение статистики порчи
}
/**
* Регистрация всех обработчиков событий
*/
public static function register()
{
Event::on(
Apple::class,
Apple::EVENT_APPLE_FALLEN,
[self::class, 'onAppleFallen']
);
Event::on(
Apple::class,
Apple::EVENT_APPLE_ROTTEN,
[self::class, 'onAppleRotten']
);
}
}