Остання активність 1746389962

https://t.me/wombatnotes/2224

KarelWintersky ревизій цього gist 1746389962. До ревизії

4 files changed, 1364 insertions

colored_routes_print.md(файл створено)

@@ -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(файл створено)

@@ -0,0 +1,1153 @@
1 + ```
2 + var_dump( AppRouter::getRoutingRules() );
3 + Печатает вот такой код:
4 +
5 + array(23) {
6 + ["GET / Closure(30-32)="]=>
7 + array(7) {
8 + ["httpMethod"]=>
9 + string(3) "GET"
10 + ["route"]=>
11 + string(1) "/"
12 + ["handler"]=>
13 + object(Closure)#46 (0) {
14 + }
15 + ["namespace"]=>
16 + string(4) "\App"
17 + ["name"]=>
18 + NULL
19 + ["middlewares"]=>
20 + array(2) {
21 + ["before"]=>
22 + object(Arris\AppRouter\Stack)#47 (1) {
23 + ["stack":"Arris\AppRouter\Stack":private]=>
24 + array(0) {
25 + }
26 + }
27 + ["after"]=>
28 + object(Arris\AppRouter\Stack)#48 (1) {
29 + ["stack":"Arris\AppRouter\Stack":private]=>
30 + array(0) {
31 + }
32 + }
33 + }
34 + ["backtrace"]=>
35 + array(5) {
36 + ["file"]=>
37 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
38 + ["line"]=>
39 + int(30)
40 + ["function"]=>
41 + string(3) "get"
42 + ["class"]=>
43 + string(15) "Arris\AppRouter"
44 + ["type"]=>
45 + string(2) "::"
46 + }
47 + }
48 + ["GET /auth/login/ \App\App\Controllers\AuthController@form_login"]=>
49 + array(7) {
50 + ["httpMethod"]=>
51 + string(3) "GET"
52 + ["route"]=>
53 + string(12) "/auth/login/"
54 + ["handler"]=>
55 + array(2) {
56 + [0]=>
57 + string(30) "App\Controllers\AuthController"
58 + [1]=>
59 + string(10) "form_login"
60 + }
61 + ["namespace"]=>
62 + string(4) "\App"
63 + ["name"]=>
64 + string(10) "form_login"
65 + ["middlewares"]=>
66 + array(2) {
67 + ["before"]=>
68 + object(Arris\AppRouter\Stack)#49 (1) {
69 + ["stack":"Arris\AppRouter\Stack":private]=>
70 + array(0) {
71 + }
72 + }
73 + ["after"]=>
74 + object(Arris\AppRouter\Stack)#50 (1) {
75 + ["stack":"Arris\AppRouter\Stack":private]=>
76 + array(0) {
77 + }
78 + }
79 + }
80 + ["backtrace"]=>
81 + array(5) {
82 + ["file"]=>
83 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
84 + ["line"]=>
85 + int(35)
86 + ["function"]=>
87 + string(3) "get"
88 + ["class"]=>
89 + string(15) "Arris\AppRouter"
90 + ["type"]=>
91 + string(2) "::"
92 + }
93 + }
94 + ["POST /auth/login/ \App\App\Controllers\AuthController@callback_login"]=>
95 + array(7) {
96 + ["httpMethod"]=>
97 + string(4) "POST"
98 + ["route"]=>
99 + string(12) "/auth/login/"
100 + ["handler"]=>
101 + array(2) {
102 + [0]=>
103 + string(30) "App\Controllers\AuthController"
104 + [1]=>
105 + string(14) "callback_login"
106 + }
107 + ["namespace"]=>
108 + string(4) "\App"
109 + ["name"]=>
110 + string(14) "callback_login"
111 + ["middlewares"]=>
112 + array(2) {
113 + ["before"]=>
114 + object(Arris\AppRouter\Stack)#51 (1) {
115 + ["stack":"Arris\AppRouter\Stack":private]=>
116 + array(0) {
117 + }
118 + }
119 + ["after"]=>
120 + object(Arris\AppRouter\Stack)#52 (1) {
121 + ["stack":"Arris\AppRouter\Stack":private]=>
122 + array(0) {
123 + }
124 + }
125 + }
126 + ["backtrace"]=>
127 + array(5) {
128 + ["file"]=>
129 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
130 + ["line"]=>
131 + int(36)
132 + ["function"]=>
133 + string(4) "post"
134 + ["class"]=>
135 + string(15) "Arris\AppRouter"
136 + ["type"]=>
137 + string(2) "::"
138 + }
139 + }
140 + ["GET /auth/logout/ \App\App\Controllers\AuthController@callback_logout"]=>
141 + array(7) {
142 + ["httpMethod"]=>
143 + string(3) "GET"
144 + ["route"]=>
145 + string(13) "/auth/logout/"
146 + ["handler"]=>
147 + array(2) {
148 + [0]=>
149 + string(30) "App\Controllers\AuthController"
150 + [1]=>
151 + string(15) "callback_logout"
152 + }
153 + ["namespace"]=>
154 + string(4) "\App"
155 + ["name"]=>
156 + string(15) "callback_logout"
157 + ["middlewares"]=>
158 + array(2) {
159 + ["before"]=>
160 + object(Arris\AppRouter\Stack)#53 (1) {
161 + ["stack":"Arris\AppRouter\Stack":private]=>
162 + array(0) {
163 + }
164 + }
165 + ["after"]=>
166 + object(Arris\AppRouter\Stack)#54 (1) {
167 + ["stack":"Arris\AppRouter\Stack":private]=>
168 + array(0) {
169 + }
170 + }
171 + }
172 + ["backtrace"]=>
173 + array(5) {
174 + ["file"]=>
175 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
176 + ["line"]=>
177 + int(37)
178 + ["function"]=>
179 + string(3) "get"
180 + ["class"]=>
181 + string(15) "Arris\AppRouter"
182 + ["type"]=>
183 + string(2) "::"
184 + }
185 + }
186 + ["GET /auth/register/ \App\827f47bf8b69fee30d84e03917576c65@__invoke"]=>
187 + array(7) {
188 + ["httpMethod"]=>
189 + string(3) "GET"
190 + ["route"]=>
191 + string(15) "/auth/register/"
192 + ["handler"]=>
193 + array(0) {
194 + }
195 + ["namespace"]=>
196 + string(4) "\App"
197 + ["name"]=>
198 + NULL
199 + ["middlewares"]=>
200 + array(2) {
201 + ["before"]=>
202 + object(Arris\AppRouter\Stack)#55 (1) {
203 + ["stack":"Arris\AppRouter\Stack":private]=>
204 + array(0) {
205 + }
206 + }
207 + ["after"]=>
208 + object(Arris\AppRouter\Stack)#56 (1) {
209 + ["stack":"Arris\AppRouter\Stack":private]=>
210 + array(0) {
211 + }
212 + }
213 + }
214 + ["backtrace"]=>
215 + array(5) {
216 + ["file"]=>
217 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
218 + ["line"]=>
219 + int(39)
220 + ["function"]=>
221 + string(3) "get"
222 + ["class"]=>
223 + string(15) "Arris\AppRouter"
224 + ["type"]=>
225 + string(2) "::"
226 + }
227 + }
228 + ["POST /auth/register/ \App\827f47bf8b69fee30d84e03917576c65@__invoke"]=>
229 + array(7) {
230 + ["httpMethod"]=>
231 + string(4) "POST"
232 + ["route"]=>
233 + string(15) "/auth/register/"
234 + ["handler"]=>
235 + array(0) {
236 + }
237 + ["namespace"]=>
238 + string(4) "\App"
239 + ["name"]=>
240 + NULL
241 + ["middlewares"]=>
242 + array(2) {
243 + ["before"]=>
244 + object(Arris\AppRouter\Stack)#57 (1) {
245 + ["stack":"Arris\AppRouter\Stack":private]=>
246 + array(0) {
247 + }
248 + }
249 + ["after"]=>
250 + object(Arris\AppRouter\Stack)#58 (1) {
251 + ["stack":"Arris\AppRouter\Stack":private]=>
252 + array(0) {
253 + }
254 + }
255 + }
256 + ["backtrace"]=>
257 + array(5) {
258 + ["file"]=>
259 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
260 + ["line"]=>
261 + int(40)
262 + ["function"]=>
263 + string(4) "post"
264 + ["class"]=>
265 + string(15) "Arris\AppRouter"
266 + ["type"]=>
267 + string(2) "::"
268 + }
269 + }
270 + ["GET /auth/remember/ \App\7141310c9236cccbb0f9e4515c1e191e@__invoke"]=>
271 + array(7) {
272 + ["httpMethod"]=>
273 + string(3) "GET"
274 + ["route"]=>
275 + string(15) "/auth/remember/"
276 + ["handler"]=>
277 + array(0) {
278 + }
279 + ["namespace"]=>
280 + string(4) "\App"
281 + ["name"]=>
282 + NULL
283 + ["middlewares"]=>
284 + array(2) {
285 + ["before"]=>
286 + object(Arris\AppRouter\Stack)#59 (1) {
287 + ["stack":"Arris\AppRouter\Stack":private]=>
288 + array(0) {
289 + }
290 + }
291 + ["after"]=>
292 + object(Arris\AppRouter\Stack)#60 (1) {
293 + ["stack":"Arris\AppRouter\Stack":private]=>
294 + array(0) {
295 + }
296 + }
297 + }
298 + ["backtrace"]=>
299 + array(5) {
300 + ["file"]=>
301 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
302 + ["line"]=>
303 + int(42)
304 + ["function"]=>
305 + string(3) "get"
306 + ["class"]=>
307 + string(15) "Arris\AppRouter"
308 + ["type"]=>
309 + string(2) "::"
310 + }
311 + }
312 + ["POST /auth/remember/ \App\7141310c9236cccbb0f9e4515c1e191e@__invoke"]=>
313 + array(7) {
314 + ["httpMethod"]=>
315 + string(4) "POST"
316 + ["route"]=>
317 + string(15) "/auth/remember/"
318 + ["handler"]=>
319 + array(0) {
320 + }
321 + ["namespace"]=>
322 + string(4) "\App"
323 + ["name"]=>
324 + NULL
325 + ["middlewares"]=>
326 + array(2) {
327 + ["before"]=>
328 + object(Arris\AppRouter\Stack)#61 (1) {
329 + ["stack":"Arris\AppRouter\Stack":private]=>
330 + array(0) {
331 + }
332 + }
333 + ["after"]=>
334 + object(Arris\AppRouter\Stack)#62 (1) {
335 + ["stack":"Arris\AppRouter\Stack":private]=>
336 + array(0) {
337 + }
338 + }
339 + }
340 + ["backtrace"]=>
341 + array(5) {
342 + ["file"]=>
343 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
344 + ["line"]=>
345 + int(43)
346 + ["function"]=>
347 + string(4) "post"
348 + ["class"]=>
349 + string(15) "Arris\AppRouter"
350 + ["type"]=>
351 + string(2) "::"
352 + }
353 + }
354 + ["GET /admin/taverns/ \App\e9021b37cdf3ddfd7edbf584f708e2a2@__invoke"]=>
355 + array(7) {
356 + ["httpMethod"]=>
357 + string(3) "GET"
358 + ["route"]=>
359 + string(15) "/admin/taverns/"
360 + ["handler"]=>
361 + array(0) {
362 + }
363 + ["namespace"]=>
364 + string(4) "\App"
365 + ["name"]=>
366 + NULL
367 + ["middlewares"]=>
368 + array(2) {
369 + ["before"]=>
370 + object(Arris\AppRouter\Stack)#64 (1) {
371 + ["stack":"Arris\AppRouter\Stack":private]=>
372 + array(1) {
373 + [0]=>
374 + array(2) {
375 + [0]=>
376 + string(30) "App\Middlewares\AuthMiddleware"
377 + [1]=>
378 + string(10) "check_auth"
379 + }
380 + }
381 + }
382 + ["after"]=>
383 + object(Arris\AppRouter\Stack)#65 (1) {
384 + ["stack":"Arris\AppRouter\Stack":private]=>
385 + array(0) {
386 + }
387 + }
388 + }
389 + ["backtrace"]=>
390 + array(5) {
391 + ["file"]=>
392 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
393 + ["line"]=>
394 + int(48)
395 + ["function"]=>
396 + string(3) "get"
397 + ["class"]=>
398 + string(15) "Arris\AppRouter"
399 + ["type"]=>
400 + string(2) "::"
401 + }
402 + }
403 + ["GET /admin/taverns/add/ \App\f01fcede504dbb43d8a159a4ca6a3cb5@__invoke"]=>
404 + array(7) {
405 + ["httpMethod"]=>
406 + string(3) "GET"
407 + ["route"]=>
408 + string(19) "/admin/taverns/add/"
409 + ["handler"]=>
410 + array(0) {
411 + }
412 + ["namespace"]=>
413 + string(4) "\App"
414 + ["name"]=>
415 + NULL
416 + ["middlewares"]=>
417 + array(2) {
418 + ["before"]=>
419 + object(Arris\AppRouter\Stack)#66 (1) {
420 + ["stack":"Arris\AppRouter\Stack":private]=>
421 + array(1) {
422 + [0]=>
423 + array(2) {
424 + [0]=>
425 + string(30) "App\Middlewares\AuthMiddleware"
426 + [1]=>
427 + string(10) "check_auth"
428 + }
429 + }
430 + }
431 + ["after"]=>
432 + object(Arris\AppRouter\Stack)#67 (1) {
433 + ["stack":"Arris\AppRouter\Stack":private]=>
434 + array(0) {
435 + }
436 + }
437 + }
438 + ["backtrace"]=>
439 + array(5) {
440 + ["file"]=>
441 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
442 + ["line"]=>
443 + int(50)
444 + ["function"]=>
445 + string(3) "get"
446 + ["class"]=>
447 + string(15) "Arris\AppRouter"
448 + ["type"]=>
449 + string(2) "::"
450 + }
451 + }
452 + ["POST /admin/taverns/insert/ \App\8bda1a98077bd07178eb401f57a87c1b@__invoke"]=>
453 + array(7) {
454 + ["httpMethod"]=>
455 + string(4) "POST"
456 + ["route"]=>
457 + string(22) "/admin/taverns/insert/"
458 + ["handler"]=>
459 + array(0) {
460 + }
461 + ["namespace"]=>
462 + string(4) "\App"
463 + ["name"]=>
464 + NULL
465 + ["middlewares"]=>
466 + array(2) {
467 + ["before"]=>
468 + object(Arris\AppRouter\Stack)#68 (1) {
469 + ["stack":"Arris\AppRouter\Stack":private]=>
470 + array(1) {
471 + [0]=>
472 + array(2) {
473 + [0]=>
474 + string(30) "App\Middlewares\AuthMiddleware"
475 + [1]=>
476 + string(10) "check_auth"
477 + }
478 + }
479 + }
480 + ["after"]=>
481 + object(Arris\AppRouter\Stack)#69 (1) {
482 + ["stack":"Arris\AppRouter\Stack":private]=>
483 + array(0) {
484 + }
485 + }
486 + }
487 + ["backtrace"]=>
488 + array(5) {
489 + ["file"]=>
490 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
491 + ["line"]=>
492 + int(51)
493 + ["function"]=>
494 + string(4) "post"
495 + ["class"]=>
496 + string(15) "Arris\AppRouter"
497 + ["type"]=>
498 + string(2) "::"
499 + }
500 + }
501 + ["GET /admin/taverns/edit/{id:\d+}/ \App\72fc6667fa06e13ce14274fa0b905010@__invoke"]=>
502 + array(7) {
503 + ["httpMethod"]=>
504 + string(3) "GET"
505 + ["route"]=>
506 + string(29) "/admin/taverns/edit/{id:\d+}/"
507 + ["handler"]=>
508 + array(0) {
509 + }
510 + ["namespace"]=>
511 + string(4) "\App"
512 + ["name"]=>
513 + NULL
514 + ["middlewares"]=>
515 + array(2) {
516 + ["before"]=>
517 + object(Arris\AppRouter\Stack)#70 (1) {
518 + ["stack":"Arris\AppRouter\Stack":private]=>
519 + array(1) {
520 + [0]=>
521 + array(2) {
522 + [0]=>
523 + string(30) "App\Middlewares\AuthMiddleware"
524 + [1]=>
525 + string(10) "check_auth"
526 + }
527 + }
528 + }
529 + ["after"]=>
530 + object(Arris\AppRouter\Stack)#71 (1) {
531 + ["stack":"Arris\AppRouter\Stack":private]=>
532 + array(0) {
533 + }
534 + }
535 + }
536 + ["backtrace"]=>
537 + array(5) {
538 + ["file"]=>
539 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
540 + ["line"]=>
541 + int(52)
542 + ["function"]=>
543 + string(3) "get"
544 + ["class"]=>
545 + string(15) "Arris\AppRouter"
546 + ["type"]=>
547 + string(2) "::"
548 + }
549 + }
550 + ["POST /admin/taverns/update/ \App\cc8eeadf70d4736ea8e4ab02b684e558@__invoke"]=>
551 + array(7) {
552 + ["httpMethod"]=>
553 + string(4) "POST"
554 + ["route"]=>
555 + string(22) "/admin/taverns/update/"
556 + ["handler"]=>
557 + array(0) {
558 + }
559 + ["namespace"]=>
560 + string(4) "\App"
561 + ["name"]=>
562 + NULL
563 + ["middlewares"]=>
564 + array(2) {
565 + ["before"]=>
566 + object(Arris\AppRouter\Stack)#72 (1) {
567 + ["stack":"Arris\AppRouter\Stack":private]=>
568 + array(1) {
569 + [0]=>
570 + array(2) {
571 + [0]=>
572 + string(30) "App\Middlewares\AuthMiddleware"
573 + [1]=>
574 + string(10) "check_auth"
575 + }
576 + }
577 + }
578 + ["after"]=>
579 + object(Arris\AppRouter\Stack)#73 (1) {
580 + ["stack":"Arris\AppRouter\Stack":private]=>
581 + array(0) {
582 + }
583 + }
584 + }
585 + ["backtrace"]=>
586 + array(5) {
587 + ["file"]=>
588 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
589 + ["line"]=>
590 + int(53)
591 + ["function"]=>
592 + string(4) "post"
593 + ["class"]=>
594 + string(15) "Arris\AppRouter"
595 + ["type"]=>
596 + string(2) "::"
597 + }
598 + }
599 + ["GET /admin/taverns/info/{id:\d+}/dishes \App\335b8ebb42b57cdde4ec70c5568a875b@__invoke"]=>
600 + array(7) {
601 + ["httpMethod"]=>
602 + string(3) "GET"
603 + ["route"]=>
604 + string(35) "/admin/taverns/info/{id:\d+}/dishes"
605 + ["handler"]=>
606 + array(0) {
607 + }
608 + ["namespace"]=>
609 + string(4) "\App"
610 + ["name"]=>
611 + NULL
612 + ["middlewares"]=>
613 + array(2) {
614 + ["before"]=>
615 + object(Arris\AppRouter\Stack)#74 (1) {
616 + ["stack":"Arris\AppRouter\Stack":private]=>
617 + array(1) {
618 + [0]=>
619 + array(2) {
620 + [0]=>
621 + string(30) "App\Middlewares\AuthMiddleware"
622 + [1]=>
623 + string(10) "check_auth"
624 + }
625 + }
626 + }
627 + ["after"]=>
628 + object(Arris\AppRouter\Stack)#75 (1) {
629 + ["stack":"Arris\AppRouter\Stack":private]=>
630 + array(0) {
631 + }
632 + }
633 + }
634 + ["backtrace"]=>
635 + array(5) {
636 + ["file"]=>
637 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
638 + ["line"]=>
639 + int(55)
640 + ["function"]=>
641 + string(3) "get"
642 + ["class"]=>
643 + string(15) "Arris\AppRouter"
644 + ["type"]=>
645 + string(2) "::"
646 + }
647 + }
648 + ["POST /admin/taverns/info/{id:\d+}/dishes \App\335b8ebb42b57cdde4ec70c5568a875b@__invoke"]=>
649 + array(7) {
650 + ["httpMethod"]=>
651 + string(4) "POST"
652 + ["route"]=>
653 + string(35) "/admin/taverns/info/{id:\d+}/dishes"
654 + ["handler"]=>
655 + array(0) {
656 + }
657 + ["namespace"]=>
658 + string(4) "\App"
659 + ["name"]=>
660 + NULL
661 + ["middlewares"]=>
662 + array(2) {
663 + ["before"]=>
664 + object(Arris\AppRouter\Stack)#76 (1) {
665 + ["stack":"Arris\AppRouter\Stack":private]=>
666 + array(1) {
667 + [0]=>
668 + array(2) {
669 + [0]=>
670 + string(30) "App\Middlewares\AuthMiddleware"
671 + [1]=>
672 + string(10) "check_auth"
673 + }
674 + }
675 + }
676 + ["after"]=>
677 + object(Arris\AppRouter\Stack)#77 (1) {
678 + ["stack":"Arris\AppRouter\Stack":private]=>
679 + array(0) {
680 + }
681 + }
682 + }
683 + ["backtrace"]=>
684 + array(5) {
685 + ["file"]=>
686 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
687 + ["line"]=>
688 + int(56)
689 + ["function"]=>
690 + string(4) "post"
691 + ["class"]=>
692 + string(15) "Arris\AppRouter"
693 + ["type"]=>
694 + string(2) "::"
695 + }
696 + }
697 + ["GET /admin/users/ \App\68db4d7a827260fd60e04f9641ad0ccb@__invoke"]=>
698 + array(7) {
699 + ["httpMethod"]=>
700 + string(3) "GET"
701 + ["route"]=>
702 + string(13) "/admin/users/"
703 + ["handler"]=>
704 + array(0) {
705 + }
706 + ["namespace"]=>
707 + string(4) "\App"
708 + ["name"]=>
709 + NULL
710 + ["middlewares"]=>
711 + array(2) {
712 + ["before"]=>
713 + object(Arris\AppRouter\Stack)#80 (1) {
714 + ["stack":"Arris\AppRouter\Stack":private]=>
715 + array(2) {
716 + [0]=>
717 + array(2) {
718 + [0]=>
719 + string(30) "App\Middlewares\AuthMiddleware"
720 + [1]=>
721 + string(10) "check_auth"
722 + }
723 + [1]=>
724 + array(2) {
725 + [0]=>
726 + string(30) "App\Middlewares\AuthMiddleware"
727 + [1]=>
728 + string(11) "check_admin"
729 + }
730 + }
731 + }
732 + ["after"]=>
733 + object(Arris\AppRouter\Stack)#81 (1) {
734 + ["stack":"Arris\AppRouter\Stack":private]=>
735 + array(0) {
736 + }
737 + }
738 + }
739 + ["backtrace"]=>
740 + array(5) {
741 + ["file"]=>
742 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
743 + ["line"]=>
744 + int(62)
745 + ["function"]=>
746 + string(3) "get"
747 + ["class"]=>
748 + string(15) "Arris\AppRouter"
749 + ["type"]=>
750 + string(2) "::"
751 + }
752 + }
753 + ["GET /admin/users/edit/{id:\d+}/ \App\51edff3d905ab95258129978fe4a8755@__invoke"]=>
754 + array(7) {
755 + ["httpMethod"]=>
756 + string(3) "GET"
757 + ["route"]=>
758 + string(27) "/admin/users/edit/{id:\d+}/"
759 + ["handler"]=>
760 + array(0) {
761 + }
762 + ["namespace"]=>
763 + string(4) "\App"
764 + ["name"]=>
765 + NULL
766 + ["middlewares"]=>
767 + array(2) {
768 + ["before"]=>
769 + object(Arris\AppRouter\Stack)#82 (1) {
770 + ["stack":"Arris\AppRouter\Stack":private]=>
771 + array(2) {
772 + [0]=>
773 + array(2) {
774 + [0]=>
775 + string(30) "App\Middlewares\AuthMiddleware"
776 + [1]=>
777 + string(10) "check_auth"
778 + }
779 + [1]=>
780 + array(2) {
781 + [0]=>
782 + string(30) "App\Middlewares\AuthMiddleware"
783 + [1]=>
784 + string(11) "check_admin"
785 + }
786 + }
787 + }
788 + ["after"]=>
789 + object(Arris\AppRouter\Stack)#83 (1) {
790 + ["stack":"Arris\AppRouter\Stack":private]=>
791 + array(0) {
792 + }
793 + }
794 + }
795 + ["backtrace"]=>
796 + array(5) {
797 + ["file"]=>
798 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
799 + ["line"]=>
800 + int(63)
801 + ["function"]=>
802 + string(3) "get"
803 + ["class"]=>
804 + string(15) "Arris\AppRouter"
805 + ["type"]=>
806 + string(2) "::"
807 + }
808 + }
809 + ["POST /admin/users/update/ \App\1e328d702d8266318ff6bb7fa9aa8de2@__invoke"]=>
810 + array(7) {
811 + ["httpMethod"]=>
812 + string(4) "POST"
813 + ["route"]=>
814 + string(20) "/admin/users/update/"
815 + ["handler"]=>
816 + array(0) {
817 + }
818 + ["namespace"]=>
819 + string(4) "\App"
820 + ["name"]=>
821 + NULL
822 + ["middlewares"]=>
823 + array(2) {
824 + ["before"]=>
825 + object(Arris\AppRouter\Stack)#84 (1) {
826 + ["stack":"Arris\AppRouter\Stack":private]=>
827 + array(2) {
828 + [0]=>
829 + array(2) {
830 + [0]=>
831 + string(30) "App\Middlewares\AuthMiddleware"
832 + [1]=>
833 + string(10) "check_auth"
834 + }
835 + [1]=>
836 + array(2) {
837 + [0]=>
838 + string(30) "App\Middlewares\AuthMiddleware"
839 + [1]=>
840 + string(11) "check_admin"
841 + }
842 + }
843 + }
844 + ["after"]=>
845 + object(Arris\AppRouter\Stack)#85 (1) {
846 + ["stack":"Arris\AppRouter\Stack":private]=>
847 + array(0) {
848 + }
849 + }
850 + }
851 + ["backtrace"]=>
852 + array(5) {
853 + ["file"]=>
854 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
855 + ["line"]=>
856 + int(64)
857 + ["function"]=>
858 + string(4) "post"
859 + ["class"]=>
860 + string(15) "Arris\AppRouter"
861 + ["type"]=>
862 + string(2) "::"
863 + }
864 + }
865 + ["GET /admin/users/delete/{id:\d+}/ \App\2dc117420c50d37684b28d29be5a525c@__invoke"]=>
866 + array(7) {
867 + ["httpMethod"]=>
868 + string(3) "GET"
869 + ["route"]=>
870 + string(29) "/admin/users/delete/{id:\d+}/"
871 + ["handler"]=>
872 + array(0) {
873 + }
874 + ["namespace"]=>
875 + string(4) "\App"
876 + ["name"]=>
877 + NULL
878 + ["middlewares"]=>
879 + array(2) {
880 + ["before"]=>
881 + object(Arris\AppRouter\Stack)#86 (1) {
882 + ["stack":"Arris\AppRouter\Stack":private]=>
883 + array(2) {
884 + [0]=>
885 + array(2) {
886 + [0]=>
887 + string(30) "App\Middlewares\AuthMiddleware"
888 + [1]=>
889 + string(10) "check_auth"
890 + }
891 + [1]=>
892 + array(2) {
893 + [0]=>
894 + string(30) "App\Middlewares\AuthMiddleware"
895 + [1]=>
896 + string(11) "check_admin"
897 + }
898 + }
899 + }
900 + ["after"]=>
901 + object(Arris\AppRouter\Stack)#87 (1) {
902 + ["stack":"Arris\AppRouter\Stack":private]=>
903 + array(0) {
904 + }
905 + }
906 + }
907 + ["backtrace"]=>
908 + array(5) {
909 + ["file"]=>
910 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
911 + ["line"]=>
912 + int(65)
913 + ["function"]=>
914 + string(3) "get"
915 + ["class"]=>
916 + string(15) "Arris\AppRouter"
917 + ["type"]=>
918 + string(2) "::"
919 + }
920 + }
921 + ["GET /admin/dishes/ \App\7e2ab5a5ee7c8ff02140bfbda1f9cde2@__invoke"]=>
922 + array(7) {
923 + ["httpMethod"]=>
924 + string(3) "GET"
925 + ["route"]=>
926 + string(14) "/admin/dishes/"
927 + ["handler"]=>
928 + array(0) {
929 + }
930 + ["namespace"]=>
931 + string(4) "\App"
932 + ["name"]=>
933 + NULL
934 + ["middlewares"]=>
935 + array(2) {
936 + ["before"]=>
937 + object(Arris\AppRouter\Stack)#88 (1) {
938 + ["stack":"Arris\AppRouter\Stack":private]=>
939 + array(2) {
940 + [0]=>
941 + array(2) {
942 + [0]=>
943 + string(30) "App\Middlewares\AuthMiddleware"
944 + [1]=>
945 + string(10) "check_auth"
946 + }
947 + [1]=>
948 + array(2) {
949 + [0]=>
950 + string(30) "App\Middlewares\AuthMiddleware"
951 + [1]=>
952 + string(11) "check_admin"
953 + }
954 + }
955 + }
956 + ["after"]=>
957 + object(Arris\AppRouter\Stack)#89 (1) {
958 + ["stack":"Arris\AppRouter\Stack":private]=>
959 + array(0) {
960 + }
961 + }
962 + }
963 + ["backtrace"]=>
964 + array(5) {
965 + ["file"]=>
966 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
967 + ["line"]=>
968 + int(70)
969 + ["function"]=>
970 + string(3) "get"
971 + ["class"]=>
972 + string(15) "Arris\AppRouter"
973 + ["type"]=>
974 + string(2) "::"
975 + }
976 + }
977 + ["GET /admin/dishes/view/ \App\493b4dff7f487593a373b373d252689e@__invoke"]=>
978 + array(7) {
979 + ["httpMethod"]=>
980 + string(3) "GET"
981 + ["route"]=>
982 + string(19) "/admin/dishes/view/"
983 + ["handler"]=>
984 + array(0) {
985 + }
986 + ["namespace"]=>
987 + string(4) "\App"
988 + ["name"]=>
989 + NULL
990 + ["middlewares"]=>
991 + array(2) {
992 + ["before"]=>
993 + object(Arris\AppRouter\Stack)#90 (1) {
994 + ["stack":"Arris\AppRouter\Stack":private]=>
995 + array(2) {
996 + [0]=>
997 + array(2) {
998 + [0]=>
999 + string(30) "App\Middlewares\AuthMiddleware"
1000 + [1]=>
1001 + string(10) "check_auth"
1002 + }
1003 + [1]=>
1004 + array(2) {
1005 + [0]=>
1006 + string(30) "App\Middlewares\AuthMiddleware"
1007 + [1]=>
1008 + string(11) "check_admin"
1009 + }
1010 + }
1011 + }
1012 + ["after"]=>
1013 + object(Arris\AppRouter\Stack)#91 (1) {
1014 + ["stack":"Arris\AppRouter\Stack":private]=>
1015 + array(0) {
1016 + }
1017 + }
1018 + }
1019 + ["backtrace"]=>
1020 + array(5) {
1021 + ["file"]=>
1022 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
1023 + ["line"]=>
1024 + int(71)
1025 + ["function"]=>
1026 + string(3) "get"
1027 + ["class"]=>
1028 + string(15) "Arris\AppRouter"
1029 + ["type"]=>
1030 + string(2) "::"
1031 + }
1032 + }
1033 + ["GET /admin/dishes/update/ \App\33b11307187ceac2d4e86e9551c85f29@__invoke"]=>
1034 + array(7) {
1035 + ["httpMethod"]=>
1036 + string(3) "GET"
1037 + ["route"]=>
1038 + string(21) "/admin/dishes/update/"
1039 + ["handler"]=>
1040 + array(0) {
1041 + }
1042 + ["namespace"]=>
1043 + string(4) "\App"
1044 + ["name"]=>
1045 + NULL
1046 + ["middlewares"]=>
1047 + array(2) {
1048 + ["before"]=>
1049 + object(Arris\AppRouter\Stack)#92 (1) {
1050 + ["stack":"Arris\AppRouter\Stack":private]=>
1051 + array(2) {
1052 + [0]=>
1053 + array(2) {
1054 + [0]=>
1055 + string(30) "App\Middlewares\AuthMiddleware"
1056 + [1]=>
1057 + string(10) "check_auth"
1058 + }
1059 + [1]=>
1060 + array(2) {
1061 + [0]=>
1062 + string(30) "App\Middlewares\AuthMiddleware"
1063 + [1]=>
1064 + string(11) "check_admin"
1065 + }
1066 + }
1067 + }
1068 + ["after"]=>
1069 + object(Arris\AppRouter\Stack)#93 (1) {
1070 + ["stack":"Arris\AppRouter\Stack":private]=>
1071 + array(0) {
1072 + }
1073 + }
1074 + }
1075 + ["backtrace"]=>
1076 + array(5) {
1077 + ["file"]=>
1078 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
1079 + ["line"]=>
1080 + int(72)
1081 + ["function"]=>
1082 + string(3) "get"
1083 + ["class"]=>
1084 + string(15) "Arris\AppRouter"
1085 + ["type"]=>
1086 + string(2) "::"
1087 + }
1088 + }
1089 + ["GET /admin/dishes/delete/ \App\c014cf502bf12c033826d5a5e9a6b02c@__invoke"]=>
1090 + array(7) {
1091 + ["httpMethod"]=>
1092 + string(3) "GET"
1093 + ["route"]=>
1094 + string(21) "/admin/dishes/delete/"
1095 + ["handler"]=>
1096 + array(0) {
1097 + }
1098 + ["namespace"]=>
1099 + string(4) "\App"
1100 + ["name"]=>
1101 + NULL
1102 + ["middlewares"]=>
1103 + array(2) {
1104 + ["before"]=>
1105 + object(Arris\AppRouter\Stack)#94 (1) {
1106 + ["stack":"Arris\AppRouter\Stack":private]=>
1107 + array(2) {
1108 + [0]=>
1109 + array(2) {
1110 + [0]=>
1111 + string(30) "App\Middlewares\AuthMiddleware"
1112 + [1]=>
1113 + string(10) "check_auth"
1114 + }
1115 + [1]=>
1116 + array(2) {
1117 + [0]=>
1118 + string(30) "App\Middlewares\AuthMiddleware"
1119 + [1]=>
1120 + string(11) "check_admin"
1121 + }
1122 + }
1123 + }
1124 + ["after"]=>
1125 + object(Arris\AppRouter\Stack)#95 (1) {
1126 + ["stack":"Arris\AppRouter\Stack":private]=>
1127 + array(0) {
1128 + }
1129 + }
1130 + }
1131 + ["backtrace"]=>
1132 + array(5) {
1133 + ["file"]=>
1134 + string(43) "/var/www/dch_spb_breakfast/public/index.php"
1135 + ["line"]=>
1136 + int(73)
1137 + ["function"]=>
1138 + string(3) "get"
1139 + ["class"]=>
1140 + string(15) "Arris\AppRouter"
1141 + ["type"]=>
1142 + string(2) "::"
1143 + }
1144 + }
1145 + }
1146 + - after middlewares
1147 + ```
1148 + Напиши мне функцию, которая будет возвращать таблицу с 5 столбцами:
1149 +
1150 + - HTTP Method + route
1151 + - handler (closure или Class @ method)
1152 + - name
1153 + - before middlwares

getRoutingTable.md(файл створено)

@@ -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(файл створено)

@@ -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 + ```
Новіше Пізніше