Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
70 / 70 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
1 / 1 |
| Routes | |
100.00% |
70 / 70 |
|
100.00% |
4 / 4 |
21 | |
100.00% |
1 / 1 |
| run | |
100.00% |
26 / 26 |
|
100.00% |
1 / 1 |
7 | |||
| showCollectionsSet | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
4 | |||
| writeHeader | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| collectData | |
100.00% |
33 / 33 |
|
100.00% |
1 / 1 |
9 | |||
| 1 | <?php declare(strict_types=1); |
| 2 | /* |
| 3 | * This file is part of Aplus Framework Dev Commands Library. |
| 4 | * |
| 5 | * (c) Natan Felles <natanfelles@gmail.com> |
| 6 | * |
| 7 | * For the full copyright and license information, please view the LICENSE |
| 8 | * file that was distributed with this source code. |
| 9 | */ |
| 10 | namespace Framework\CLI\Commands; |
| 11 | |
| 12 | use Framework\CLI\CLI; |
| 13 | use Framework\CLI\Command; |
| 14 | use Framework\MVC\App; |
| 15 | |
| 16 | /** |
| 17 | * Class Routes. |
| 18 | * |
| 19 | * @package dev-commands |
| 20 | */ |
| 21 | class Routes extends Command |
| 22 | { |
| 23 | protected string $name = 'routes'; |
| 24 | protected string $description = 'Shows routes list.'; |
| 25 | protected string $usage = 'routes [options]'; |
| 26 | protected string $routerInstance = 'default'; |
| 27 | |
| 28 | public function run() : void |
| 29 | { |
| 30 | $instance = $this->console->getArgument(0); |
| 31 | if ($instance !== null) { |
| 32 | $this->routerInstance = $instance; |
| 33 | } |
| 34 | CLI::write( |
| 35 | CLI::style('Router Instance:', CLI::FG_YELLOW, formats: [CLI::FM_BOLD]) |
| 36 | . ' ' . $this->routerInstance |
| 37 | ); |
| 38 | CLI::newLine(); |
| 39 | $data = $this->collectData(); |
| 40 | $count = \count($data); |
| 41 | $this->showCollectionsSet($count); |
| 42 | foreach ($data as $index => $collection) { |
| 43 | CLI::write(CLI::style('Route Collection ' . ($index + 1), CLI::FG_YELLOW, formats: [CLI::FM_BOLD])); |
| 44 | $this->writeHeader('Origin', $collection['origin']); |
| 45 | if (isset($collection['name'])) { |
| 46 | $this->writeHeader('Name', $collection['name']); |
| 47 | } |
| 48 | $this->writeHeader('Routes Count', (string) $collection['count']); |
| 49 | if (isset($collection['notFound'])) { |
| 50 | $this->writeHeader('Route Not Found', $collection['notFound']); |
| 51 | } |
| 52 | if ($collection['routes']) { |
| 53 | CLI::table( |
| 54 | $collection['routes'], |
| 55 | ['#', 'Method', 'Path', 'Action', 'Name', 'Has Options'] |
| 56 | ); |
| 57 | } |
| 58 | if ($index + 1 < $count) { |
| 59 | CLI::newLine(); |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | protected function showCollectionsSet(int $count) : void |
| 65 | { |
| 66 | if ($count === 0) { |
| 67 | CLI::write('No Route Collection has been set.', CLI::FG_RED); |
| 68 | return; |
| 69 | } |
| 70 | $plural = $count > 1; |
| 71 | CLI::write( |
| 72 | 'There ' . ($plural ? 'are' : 'is') . ' ' . $count |
| 73 | . ' Route Collection' . ($plural ? 's' : '') . ' set:', |
| 74 | CLI::FG_GREEN |
| 75 | ); |
| 76 | CLI::newLine(); |
| 77 | } |
| 78 | |
| 79 | protected function writeHeader(string $field, string $value) : void |
| 80 | { |
| 81 | CLI::write(CLI::style($field . ':', formats: [CLI::FM_BOLD]) . ' ' . $value); |
| 82 | } |
| 83 | |
| 84 | /** |
| 85 | * @return array<int,mixed> |
| 86 | */ |
| 87 | protected function collectData() : array |
| 88 | { |
| 89 | $data = []; |
| 90 | foreach (App::router($this->routerInstance)->getCollections() as $index => $collection) { |
| 91 | $data[$index]['origin'] = $collection->origin; |
| 92 | $data[$index]['name'] = $collection->name; |
| 93 | $data[$index]['count'] = $collection->count(); |
| 94 | $notFound = null; |
| 95 | if (isset($collection->notFoundAction)) { |
| 96 | $notFound = \is_string($collection->notFoundAction) // @phpstan-ignore-line |
| 97 | ? $collection->notFoundAction // @phpstan-ignore-line |
| 98 | : 'Closure'; |
| 99 | } |
| 100 | $data[$index]['notFound'] = $notFound; |
| 101 | $data[$index]['routes'] = []; |
| 102 | foreach ($collection->routes as $method => $routes) { |
| 103 | foreach ($routes as $route) { |
| 104 | $action = $route->getAction(); |
| 105 | $action = \is_string($action) ? $action : 'Closure'; |
| 106 | $data[$index]['routes'][] = [ |
| 107 | 'method' => $method, |
| 108 | 'path' => $route->getPath(), |
| 109 | 'action' => $action, |
| 110 | 'name' => $route->getName(), |
| 111 | 'hasOptions' => $route->getOptions() ? 'Yes' : 'No', |
| 112 | ]; |
| 113 | } |
| 114 | \usort($data[$index]['routes'], static function ($route1, $route2) { |
| 115 | return \strcmp($route1['method'], $route2['method']); |
| 116 | }); |
| 117 | } |
| 118 | $count = 0; |
| 119 | foreach ($data[$index]['routes'] as &$route) { |
| 120 | $route = \array_reverse($route); |
| 121 | $route['#'] = ++$count; |
| 122 | $route = \array_reverse($route); |
| 123 | } |
| 124 | unset($route); |
| 125 | } |
| 126 | return $data; |
| 127 | } |
| 128 | } |