/
MiddlewareCollector.php
94 lines (81 loc) · 2.71 KB
/
MiddlewareCollector.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
<?php
declare(strict_types=1);
namespace Yiisoft\Yii\Debug\Collector;
use ReflectionClass;
use Yiisoft\Middleware\Dispatcher\Event\AfterMiddleware;
use Yiisoft\Middleware\Dispatcher\Event\BeforeMiddleware;
final class MiddlewareCollector implements CollectorInterface, IndexCollectorInterface
{
use CollectorTrait;
private array $beforeStack = [];
private array $afterStack = [];
public function getCollected(): array
{
$beforeStack = $this->beforeStack;
$afterStack = $this->afterStack;
$beforeAction = array_pop($beforeStack);
$afterAction = array_shift($afterStack);
$actionHandler = [];
if ($beforeAction !== null && $afterAction !== null) {
$actionHandler = $this->getActionHandler($beforeAction, $afterAction);
}
return [
'beforeStack' => $beforeStack,
'actionHandler' => $actionHandler,
'afterStack' => $afterStack,
];
}
public function collect(BeforeMiddleware|AfterMiddleware $event): void
{
if (!$this->isActive()) {
return;
}
if (
method_exists($event->getMiddleware(), '__debugInfo')
&& (new ReflectionClass($event->getMiddleware()))->isAnonymous()
) {
$name = implode('::', $event->getMiddleware()->__debugInfo()['callback']);
} else {
$name = $event->getMiddleware()::class;
}
if ($event instanceof BeforeMiddleware) {
$this->beforeStack[] = [
'name' => $name,
'time' => microtime(true),
'memory' => memory_get_usage(),
'request' => $event->getRequest(),
];
} else {
$this->afterStack[] = [
'name' => $name,
'time' => microtime(true),
'memory' => memory_get_usage(),
'response' => $event->getResponse(),
];
}
}
private function reset(): void
{
$this->beforeStack = [];
$this->afterStack = [];
}
public function getIndexData(): array
{
return [
'middleware' => [
'total' => ($total = count($this->beforeStack)) > 0 ? $total - 1 : 0, // Remove action handler
],
];
}
private function getActionHandler(array $beforeAction, array $afterAction): array
{
return [
'name' => $beforeAction['name'],
'startTime' => $beforeAction['time'],
'request' => $beforeAction['request'],
'response' => $afterAction['response'],
'endTime' => $afterAction['time'],
'memory' => $afterAction['memory'],
];
}
}