1111use PhpApi \Model \Request \AbstractRequest ;
1212use PhpApi \Model \Response \AbstractResponse ;
1313use PhpApi \Model \RouterOptions ;
14+ use PhpApi \Swagger \GenerateSwaggerDocs ;
1415use PhpApi \Utility \Arrays ;
1516use ReflectionClass ;
1617use ReflectionFunction ;
2021
2122class Router
2223{
24+ public const StaticRoutes = [
25+ 'GET ' => [
26+ '/swagger ' => 'handleSwaggerPage ' ,
27+ '/swagger/json ' => 'handleSwaggerJson ' ,
28+ ],
29+ ];
30+
2331 protected AutoRoute $ autoRoute ;
2432
2533 /** @var IRequestMiddleware[] $requestMiddlewares */
@@ -31,6 +39,9 @@ class Router
3139 /** @var array<int, callable> $errorHandlers */
3240 private array $ errorHandlers = [];
3341
42+ /**
43+ * @param callable|null $controllerFactory
44+ */
3445 public function __construct (
3546 private RouterOptions $ routerOptions ,
3647 private mixed $ controllerFactory = null ,
@@ -60,6 +71,12 @@ public function route(?Request $request = null): void
6071 $ request = new Request ();
6172 }
6273
74+ if (isset (self ::StaticRoutes[$ request ->method ->name ][$ request ->url ->path ])) {
75+ $ method = self ::StaticRoutes[$ request ->method ->name ][$ request ->url ->path ];
76+ $ this ->$ method ();
77+ return ;
78+ }
79+
6380 $ route = $ this ->autoRoute ->getRouter ()
6481 ->route ($ request ->method ->name ?? 'GET ' , $ request ->url ->path ?? '' );
6582
@@ -212,4 +229,25 @@ private function defaultErrorHandler(): Response
212229
213230 return $ response ;
214231 }
232+
233+ private function handleSwaggerJson (): void
234+ {
235+ $ response = new Response ();
236+ $ response ->setCode (200 );
237+ $ response ->setHeader ('Content-Type ' , 'application/json ' );
238+ $ response ->setContent ((new GenerateSwaggerDocs (
239+ $ this ->autoRoute ,
240+ $ this ->routerOptions ,
241+ ))->generate ());
242+ $ response ->send ();
243+ }
244+
245+ private function handleSwaggerPage (): void
246+ {
247+ $ response = new Response ();
248+ $ response ->setCode (200 );
249+ $ response ->setHeader ('Content-Type ' , 'text/html ' );
250+ $ response ->setContent (file_get_contents (__DIR__ . '/../swagger/index.html ' ));
251+ $ response ->send ();
252+ }
215253}
0 commit comments