Expand the response with headers and set status code
diff --git a/app/Controller/BaseController.php b/app/Controller/BaseController.php
deleted file mode 100644
index 8e24148..0000000
--- a/app/Controller/BaseController.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace App\Controller;
-
-use Ardent\Undercurrent\Attribute\Route;
-use Ardent\Undercurrent\Http\GenericResponse;
-use Ardent\Undercurrent\Http\ResponseInterface;
-
-class BaseController
-{
-    #[Route('/hello')]
-    public function helloWorld(): ResponseInterface
-    {
-        return new GenericResponse('Hello World!');
-    }
-}
\ No newline at end of file
diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php
new file mode 100644
index 0000000..8361e9d
--- /dev/null
+++ b/app/Controller/HelloWorldController.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Controller;
+
+use Ardent\Undercurrent\Attribute\Route;
+use Ardent\Undercurrent\Http\GenericResponse;
+use Ardent\Undercurrent\Http\ResponseInterface;
+use Ardent\Undercurrent\Http\StatusEnum;
+
+class HelloWorldController
+{
+    #[Route('/')]
+    public function index(): ResponseInterface
+    {
+        return new GenericResponse('Index, <a href="/hello">Hello</a>');
+    }
+
+    #[Route('/error')]
+    public function error(): ResponseInterface
+    {
+        return new GenericResponse('error', StatusEnum::NOT_FOUND);
+    }
+
+    #[Route('/hello')]
+    public function hello(): ResponseInterface
+    {
+        return new GenericResponse('Hello World!');
+    }
+}
\ No newline at end of file
diff --git a/app/Kernel.php b/app/Kernel.php
index a365d39..8b28577 100644
--- a/app/Kernel.php
+++ b/app/Kernel.php
@@ -2,7 +2,7 @@
 namespace App;
-use App\Controller\BaseController;
+use App\Controller\HelloWorldController;
 use Ardent\Undercurrent\Container\ContainerInterface;
 use Ardent\Undercurrent\Kernel\BaseKernel;
@@ -11,7 +11,7 @@ class Kernel extends BaseKernel
     protected function dependencies(ContainerInterface $container): void
     {
         $this->addControllers($container, [
-            BaseController::class,
+            HelloWorldController::class,
         ]);
     }
 }
\ No newline at end of file
diff --git a/src/Container/ContainerInterface.php b/src/Container/ContainerInterface.php
index bd50325..7b55a94 100644
--- a/src/Container/ContainerInterface.php
+++ b/src/Container/ContainerInterface.php
@@ -16,7 +16,7 @@ interface ContainerInterface
      * @template TClassName
      * @param class-string<TClassName> $className
      * @return TClassName
-     * @throws Exception
+     * @throws ClassNotFoundException
      */
     public function get(string $className): object;
 }
\ No newline at end of file
diff --git a/src/Http/GenericResponse.php b/src/Http/GenericResponse.php
index d80d350..18852ff 100644
--- a/src/Http/GenericResponse.php
+++ b/src/Http/GenericResponse.php
@@ -7,6 +7,7 @@ class GenericResponse implements ResponseInterface
     public function __construct(
         private readonly string     $body,
         private readonly StatusEnum $status = StatusEnum::OK,
+        private readonly array      $headers = [],
     )
     {
     }
@@ -20,4 +21,12 @@ class GenericResponse implements ResponseInterface
     {
         return $this->body;
     }
+
+    /**
+     * @inheritDoc
+     */
+    public function getHeaders(): array
+    {
+        return $this->headers;
+    }
 }
\ No newline at end of file
diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php
index 73ce8f1..b2d8e1d 100644
--- a/src/Http/GenericRouter.php
+++ b/src/Http/GenericRouter.php
@@ -2,9 +2,7 @@
 namespace Ardent\Undercurrent\Http;
-use App\Controller\BaseController;
-use Ardent\Undercurrent\Attribute\Route;
-use Ardent\Undercurrent\Collector\ClassAttributeCollector;
+use Ardent\Undercurrent\Container\ClassNotFoundException;
 use Ardent\Undercurrent\Container\ContainerInterface;
 class GenericRouter implements RouterInterface
@@ -16,6 +14,9 @@ class GenericRouter implements RouterInterface
     {
     }
+    /**
+     * @throws RouteNotFoundException|ClassNotFoundException
+     */
     public function dispatch(RequestInterface $request): ResponseInterface
     {
         foreach ($this->config->getRoutes() as $route) {
diff --git a/src/Http/ResponseInterface.php b/src/Http/ResponseInterface.php
index abdc290..8047eb9 100644
--- a/src/Http/ResponseInterface.php
+++ b/src/Http/ResponseInterface.php
@@ -7,4 +7,9 @@ interface ResponseInterface
     public function getStatus(): StatusEnum;
     public function getBody(): string;
+
+    /**
+     * @return array<string>
+     */
+    public function getHeaders(): array;
 }
\ No newline at end of file
diff --git a/src/Kernel/BaseKernel.php b/src/Kernel/BaseKernel.php
index 7122dcc..634cafc 100644
--- a/src/Kernel/BaseKernel.php
+++ b/src/Kernel/BaseKernel.php
@@ -33,9 +33,16 @@ class BaseKernel
             $_SERVER['REQUEST_URI'],
             $_REQUEST,
         );
-
         $router = $container->get(RouterInterface::class);
-        echo $router->dispatch($request)->getBody();
+        $response = $router->dispatch($request);
+
+        http_response_code($response->getStatus()->value);
+
+        foreach ($response->getHeaders() as $header) {
+            header($header);
+        }
+
+        echo $response->getBody();
     }
     protected function addControllers(ContainerInterface $container, array $controllers): void
			
			
This commit is contained in:
		| @@ -1,16 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| namespace App\Controller; | ||||
|  | ||||
| use Ardent\Undercurrent\Attribute\Route; | ||||
| use Ardent\Undercurrent\Http\GenericResponse; | ||||
| use Ardent\Undercurrent\Http\ResponseInterface; | ||||
|  | ||||
| class BaseController | ||||
| { | ||||
|     #[Route('/hello')] | ||||
|     public function helloWorld(): ResponseInterface | ||||
|     { | ||||
|         return new GenericResponse('Hello World!'); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								app/Controller/HelloWorldController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/Controller/HelloWorldController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| <?php | ||||
|  | ||||
| namespace App\Controller; | ||||
|  | ||||
| use Ardent\Undercurrent\Attribute\Route; | ||||
| use Ardent\Undercurrent\Http\GenericResponse; | ||||
| use Ardent\Undercurrent\Http\ResponseInterface; | ||||
| use Ardent\Undercurrent\Http\StatusEnum; | ||||
|  | ||||
| class HelloWorldController | ||||
| { | ||||
|     #[Route('/')] | ||||
|     public function index(): ResponseInterface | ||||
|     { | ||||
|         return new GenericResponse('Index, <a href="/hello">Hello</a>'); | ||||
|     } | ||||
|  | ||||
|     #[Route('/error')] | ||||
|     public function error(): ResponseInterface | ||||
|     { | ||||
|         return new GenericResponse('error', StatusEnum::NOT_FOUND); | ||||
|     } | ||||
|  | ||||
|     #[Route('/hello')] | ||||
|     public function hello(): ResponseInterface | ||||
|     { | ||||
|         return new GenericResponse('Hello World!'); | ||||
|     } | ||||
| } | ||||
| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| namespace App; | ||||
|  | ||||
| use App\Controller\BaseController; | ||||
| use App\Controller\HelloWorldController; | ||||
| use Ardent\Undercurrent\Container\ContainerInterface; | ||||
| use Ardent\Undercurrent\Kernel\BaseKernel; | ||||
|  | ||||
| @@ -11,7 +11,7 @@ class Kernel extends BaseKernel | ||||
|     protected function dependencies(ContainerInterface $container): void | ||||
|     { | ||||
|         $this->addControllers($container, [ | ||||
|             BaseController::class, | ||||
|             HelloWorldController::class, | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
| @@ -16,7 +16,7 @@ interface ContainerInterface | ||||
|      * @template TClassName | ||||
|      * @param class-string<TClassName> $className | ||||
|      * @return TClassName | ||||
|      * @throws Exception | ||||
|      * @throws ClassNotFoundException | ||||
|      */ | ||||
|     public function get(string $className): object; | ||||
| } | ||||
| @@ -7,6 +7,7 @@ class GenericResponse implements ResponseInterface | ||||
|     public function __construct( | ||||
|         private readonly string     $body, | ||||
|         private readonly StatusEnum $status = StatusEnum::OK, | ||||
|         private readonly array      $headers = [], | ||||
|     ) | ||||
|     { | ||||
|     } | ||||
| @@ -20,4 +21,12 @@ class GenericResponse implements ResponseInterface | ||||
|     { | ||||
|         return $this->body; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @inheritDoc | ||||
|      */ | ||||
|     public function getHeaders(): array | ||||
|     { | ||||
|         return $this->headers; | ||||
|     } | ||||
| } | ||||
| @@ -2,9 +2,7 @@ | ||||
|  | ||||
| namespace Ardent\Undercurrent\Http; | ||||
|  | ||||
| use App\Controller\BaseController; | ||||
| use Ardent\Undercurrent\Attribute\Route; | ||||
| use Ardent\Undercurrent\Collector\ClassAttributeCollector; | ||||
| use Ardent\Undercurrent\Container\ClassNotFoundException; | ||||
| use Ardent\Undercurrent\Container\ContainerInterface; | ||||
|  | ||||
| class GenericRouter implements RouterInterface | ||||
| @@ -16,6 +14,9 @@ class GenericRouter implements RouterInterface | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @throws RouteNotFoundException|ClassNotFoundException | ||||
|      */ | ||||
|     public function dispatch(RequestInterface $request): ResponseInterface | ||||
|     { | ||||
|         foreach ($this->config->getRoutes() as $route) { | ||||
|   | ||||
| @@ -7,4 +7,9 @@ interface ResponseInterface | ||||
|     public function getStatus(): StatusEnum; | ||||
|  | ||||
|     public function getBody(): string; | ||||
|  | ||||
|     /** | ||||
|      * @return array<string> | ||||
|      */ | ||||
|     public function getHeaders(): array; | ||||
| } | ||||
| @@ -33,9 +33,16 @@ class BaseKernel | ||||
|             $_SERVER['REQUEST_URI'], | ||||
|             $_REQUEST, | ||||
|         ); | ||||
|  | ||||
|         $router = $container->get(RouterInterface::class); | ||||
|         echo $router->dispatch($request)->getBody(); | ||||
|         $response = $router->dispatch($request); | ||||
|  | ||||
|         http_response_code($response->getStatus()->value); | ||||
|  | ||||
|         foreach ($response->getHeaders() as $header) { | ||||
|             header($header); | ||||
|         } | ||||
|  | ||||
|         echo $response->getBody(); | ||||
|     } | ||||
|  | ||||
|     protected function addControllers(ContainerInterface $container, array $controllers): void | ||||
|   | ||||
		Reference in New Issue
	
	Block a user