Like 0

https://t.me/wombatnotes/2224

KarelWintersky revised this gist 1 year ago · a10dc31

4 files changed, 1364 insertions

colored_routes_print.md (file created)
@@ -0,0 +1,92 @@
1 + Вот переписанная функция с использованием `match` (доступен в PHP 8.0+), которая возвращает стили для HTTP-методов:
2 +
3 + ### **1. Функция `getMethodColor` с `match`**
4 + ```php
5 + function getMethodColor(string $method): string
6 + {
7 + return match(strtoupper($method)) {
8 + 'GET' => 'background: #E6F7FF; color: #003366;',
9 + 'POST' => 'background: #E8F5E9; color: #1B5E20;',
10 + 'PUT',
11 + 'PATCH' => 'background: #FFF3E0; color: #E65100;', // Один стиль для PUT и PATCH
12 + 'DELETE' => 'background: #FFEBEE; color: #C62828;',
13 + default => 'background: #F5F5F5; color: #212121;'
14 + };
15 + }
16 + ```
17 +
18 + ### **2. Полный пример таблицы с `match`**
19 + ```php
20 + function getRoutingTable(array $routingRules): string
21 + {
22 + $table = "<table border='1' cellpadding='5' cellspacing='0' style='width:100%; border-collapse: collapse;'>";
23 + $table .= "<thead><tr style='background: #f0f0f0;'>
24 + <th>Method + Route</th>
25 + <th>Handler</th>
26 + <th>Name</th>
27 + <th>Before Middlewares</th>
28 + <th>After Middlewares</th>
29 + </tr></thead><tbody>";
30 +
31 + foreach ($routingRules as $route) {
32 + $method = $route['httpMethod'];
33 + $style = getMethodColor($method);
34 +
35 + $handler = match(true) {
36 + is_array($route['handler']) && count($route['handler']) === 2
37 + => "{$route['handler'][0]}@{$route['handler'][1]}",
38 + $route['handler'] instanceof Closure
39 + => 'Closure',
40 + isset($route['handler']['__invoke'])
41 + => 'Invokable Class',
42 + default => 'Unknown'
43 + };
44 +
45 + $table .= "<tr style='{$style}'>
46 + <td><strong>{$method}</strong> {$route['route']}</td>
47 + <td>{$handler}</td>
48 + <td>{$route['name'] ?? 'NULL'}</td>
49 + <td>" . formatMiddlewares($route['middlewares']['before']) . "</td>
50 + <td>" . formatMiddlewares($route['middlewares']['after']) . "</td>
51 + </tr>";
52 + }
53 +
54 + $table .= "</tbody></table>";
55 + return $table;
56 + }
57 +
58 + // Вспомогательная функция для форматирования middleware
59 + function formatMiddlewares(iterable $middlewares): string
60 + {
61 + $result = [];
62 + foreach ($middlewares as $mw) {
63 + if (is_array($mw) && count($mw) === 2) {
64 + $result[] = "{$mw[0]}@{$mw[1]}";
65 + }
66 + }
67 + return $result ? implode('<br>', $result) : 'None';
68 + }
69 + ```
70 +
71 + ### **Ключевые улучшения**:
72 + 1. **`match` для HTTP-методов**:
73 + - Четкое сопоставление значений без `break`.
74 + - Группировка `PUT` и `PATCH` в один стиль.
75 +
76 + 2. **`match` для определения типа handler**:
77 + - Заменил цепочку `if-else` на более читаемый `match(true)`.
78 +
79 + 3. **Дополнительные стили**:
80 + - Улучшено оформление таблицы (границы, отступы).
81 + - Жирный шрифт для HTTP-метода.
82 +
83 + 4. **Вспомогательная функция**:
84 + - `formatMiddlewares()` для единообразного вывода middleware.
85 +
86 + ### **Пример вывода**:
87 + | Method + Route | Handler | Name | Before Middlewares | After Middlewares |
88 + |------------------------------|----------------------------------|------------|--------------------------|-------------------|
89 + | **GET** /api/users | UserController@index | users.list | AuthMiddleware | None |
90 + | **POST** /api/users | UserController@store | NULL | AuthMiddleware, CSRF | LogMiddleware |
91 +
92 + Такой код лучше соответствует современным стандартам PHP (8.0+) и улучшает читаемость.
dump.md (file created)

Diff is too large to be shown

getRoutingTable.md (file created)
@@ -0,0 +1,63 @@
1 + ```php
2 + function getRoutingTable(array $routingRules): string
3 + {
4 + $table = "<table border='1' cellpadding='5' cellspacing='0'>";
5 + $table .= "<thead><tr>
6 + <th>HTTP Method + Route</th>
7 + <th>Handler</th>
8 + <th>Name</th>
9 + <th>Before Middlewares</th>
10 + <th>After Middlewares</th>
11 + </tr></thead><tbody>";
12 +
13 + foreach ($routingRules as $route) {
14 + // HTTP Method + Route
15 + $methodRoute = "{$route['httpMethod']} {$route['route']}";
16 +
17 + // Handler
18 + $handler = '';
19 + if (is_array($route['handler']) && count($route['handler']) === 2) {
20 + $handler = "{$route['handler'][0]}@{$route['handler'][1]}";
21 + } elseif ($route['handler'] instanceof Closure) {
22 + $handler = 'Closure';
23 + } elseif (isset($route['handler']['__invoke'])) {
24 + $handler = 'Invokable Class';
25 + }
26 +
27 + // Name
28 + $name = $route['name'] ?? 'NULL';
29 +
30 + // Before Middlewares
31 + $beforeMiddlewares = [];
32 + foreach ($route['middlewares']['before'] as $middleware) {
33 + if (is_array($middleware) && count($middleware) === 2) {
34 + $beforeMiddlewares[] = "{$middleware[0]}@{$middleware[1]}";
35 + }
36 + }
37 + $beforeMiddlewaresStr = implode('<br>', $beforeMiddlewares) ?: 'None';
38 +
39 + // After Middlewares
40 + $afterMiddlewares = [];
41 + foreach ($route['middlewares']['after'] as $middleware) {
42 + if (is_array($middleware) {
43 + $afterMiddlewares[] = "{$middleware[0]}@{$middleware[1]}";
44 + }
45 + }
46 + $afterMiddlewaresStr = implode('<br>', $afterMiddlewares) ?: 'None';
47 +
48 + $table .= "<tr>
49 + <td>{$methodRoute}</td>
50 + <td>{$handler}</td>
51 + <td>{$name}</td>
52 + <td>{$beforeMiddlewaresStr}</td>
53 + <td>{$afterMiddlewaresStr}</td>
54 + </tr>";
55 + }
56 +
57 + $table .= "</tbody></table>";
58 + return $table;
59 + }
60 +
61 + // Использование:
62 + echo getRoutingTable(AppRouter::getRoutingRules());
63 + ```
getRoutingTableText.md (file created)
@@ -0,0 +1,56 @@
1 + ```php
2 + function getRoutingTableText(array $routingRules): string
3 + {
4 + $output = "HTTP Method + Route\tHandler\tName\tBefore Middlewares\tAfter Middlewares\n";
5 + $output .= str_repeat("-", 150) . "\n";
6 +
7 + foreach ($routingRules as $route) {
8 + // HTTP Method + Route
9 + $methodRoute = "{$route['httpMethod']} {$route['route']}";
10 +
11 + // Handler
12 + $handler = '';
13 + if (is_array($route['handler']) && count($route['handler']) === 2) {
14 + $handler = "{$route['handler'][0]}@{$route['handler'][1]}";
15 + } elseif ($route['handler'] instanceof Closure) {
16 + $handler = 'Closure';
17 + } elseif (isset($route['handler']['__invoke'])) {
18 + $handler = 'Invokable Class';
19 + }
20 +
21 + // Name
22 + $name = $route['name'] ?? 'NULL';
23 +
24 + // Before Middlewares
25 + $beforeMiddlewares = [];
26 + foreach ($route['middlewares']['before'] as $middleware) {
27 + if (is_array($middleware) && count($middleware) === 2) {
28 + $beforeMiddlewares[] = "{$middleware[0]}@{$middleware[1]}";
29 + }
30 + }
31 + $beforeMiddlewaresStr = implode(', ', $beforeMiddlewares) ?: 'None';
32 +
33 + // After Middlewares
34 + $afterMiddlewares = [];
35 + foreach ($route['middlewares']['after'] as $middleware) {
36 + if (is_array($middleware)) {
37 + $afterMiddlewares[] = "{$middleware[0]}@{$middleware[1]}";
38 + }
39 + }
40 + $afterMiddlewaresStr = implode(', ', $afterMiddlewares) ?: 'None';
41 +
42 + $output .= sprintf("%-40s %-40s %-15s %-30s %-30s\n",
43 + $methodRoute,
44 + $handler,
45 + $name,
46 + $beforeMiddlewaresStr,
47 + $afterMiddlewaresStr
48 + );
49 + }
50 +
51 + return $output;
52 + }
53 +
54 + // Использование:
55 + echo getRoutingTableText(AppRouter::getRoutingRules());
56 + ```