| @@ -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+) и улучшает читаемость. | |
KarelWintersky / Web Routes Dump, print it as table
Last active 2 months ago
https://t.me/wombatnotes/2224
KarelWintersky revised this gist 1 year ago · a10dc31
4 files changed, 1364 insertions
Diff is too large to be shown
| @@ -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 | + | ``` | |
| @@ -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 | + | ``` | |