UnderCurrent/app/Controller/HelloWorldController.php

55 lines
1.5 KiB
PHP
Raw Normal View History

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
2023-08-08 17:18:18 +02:00
<?php
namespace App\Controller;
use Ardent\Undercurrent\Attribute\Route;
use Ardent\Undercurrent\Http\GenericResponse;
use Ardent\Undercurrent\Http\ResponseInterface;
Add controller method autowiring diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php index 8361e9d..282a990 100644 --- a/app/Controller/HelloWorldController.php +++ b/app/Controller/HelloWorldController.php @@ -5,6 +5,7 @@ namespace App\Controller; use Ardent\Undercurrent\Attribute\Route; use Ardent\Undercurrent\Http\GenericResponse; use Ardent\Undercurrent\Http\ResponseInterface; +use Ardent\Undercurrent\Http\RouterConfig; use Ardent\Undercurrent\Http\StatusEnum; class HelloWorldController @@ -26,4 +27,21 @@ class HelloWorldController { return new GenericResponse('Hello World!'); } + + #[Route('/routes')] + public function routes(RouterConfig $config): ResponseInterface + { + $routes = implode('<br>', array_map( + fn($route) => $route->getRoute()->path, + $config->getRoutes() + )); + + return new GenericResponse($routes); + } + + #[Route('/world/{name}')] + public function world(string $name): ResponseInterface + { + return new GenericResponse("Hello $name!"); + } } \ No newline at end of file diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index b2d8e1d..23e9311 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -4,6 +4,8 @@ namespace Ardent\Undercurrent\Http; use Ardent\Undercurrent\Container\ClassNotFoundException; use Ardent\Undercurrent\Container\ContainerInterface; +use Exception; +use ReflectionMethod; class GenericRouter implements RouterInterface { @@ -23,10 +25,26 @@ class GenericRouter implements RouterInterface if ($route->getRoute()->path === $request->getUri()) { $controller = $this->container->get($route->getController()); $method = $route->getMethod(); - return $controller->$method(); + return $controller->$method(...$this->autowire($route)); } } throw new RouteNotFoundException($request); } + + private function autowire(RouteConfig $route): array + { + $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod()); + + $params = []; + foreach ($reflectionMethod->getParameters() as $parameter) { + $type = $parameter->getType(); + if (!$type) { + throw new Exception('Cannot autowire parameter without type'); + } + $params[] = $this->container->get($type->getName()); + } + + return $params; + } } \ No newline at end of file
2023-08-09 00:49:47 +02:00
use Ardent\Undercurrent\Http\RouterConfig;
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
2023-08-08 17:18:18 +02:00
use Ardent\Undercurrent\Http\StatusEnum;
use Ardent\Undercurrent\View\BaseView;
use Ardent\Undercurrent\View\ViewInterface;
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
2023-08-08 17:18:18 +02:00
class HelloWorldController
{
#[Route('/')]
public function index(): ViewInterface
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
2023-08-08 17:18:18 +02:00
{
2023-08-15 13:37:03 +02:00
return new BaseView('/index');
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
2023-08-08 17:18:18 +02:00
}
#[Route('/error')]
public function error(): ResponseInterface
{
return new GenericResponse('error', StatusEnum::NOT_FOUND);
}
#[Route('/hello')]
public function hello(): ResponseInterface
{
return new GenericResponse('Hello World!');
}
Add controller method autowiring diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php index 8361e9d..282a990 100644 --- a/app/Controller/HelloWorldController.php +++ b/app/Controller/HelloWorldController.php @@ -5,6 +5,7 @@ namespace App\Controller; use Ardent\Undercurrent\Attribute\Route; use Ardent\Undercurrent\Http\GenericResponse; use Ardent\Undercurrent\Http\ResponseInterface; +use Ardent\Undercurrent\Http\RouterConfig; use Ardent\Undercurrent\Http\StatusEnum; class HelloWorldController @@ -26,4 +27,21 @@ class HelloWorldController { return new GenericResponse('Hello World!'); } + + #[Route('/routes')] + public function routes(RouterConfig $config): ResponseInterface + { + $routes = implode('<br>', array_map( + fn($route) => $route->getRoute()->path, + $config->getRoutes() + )); + + return new GenericResponse($routes); + } + + #[Route('/world/{name}')] + public function world(string $name): ResponseInterface + { + return new GenericResponse("Hello $name!"); + } } \ No newline at end of file diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index b2d8e1d..23e9311 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -4,6 +4,8 @@ namespace Ardent\Undercurrent\Http; use Ardent\Undercurrent\Container\ClassNotFoundException; use Ardent\Undercurrent\Container\ContainerInterface; +use Exception; +use ReflectionMethod; class GenericRouter implements RouterInterface { @@ -23,10 +25,26 @@ class GenericRouter implements RouterInterface if ($route->getRoute()->path === $request->getUri()) { $controller = $this->container->get($route->getController()); $method = $route->getMethod(); - return $controller->$method(); + return $controller->$method(...$this->autowire($route)); } } throw new RouteNotFoundException($request); } + + private function autowire(RouteConfig $route): array + { + $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod()); + + $params = []; + foreach ($reflectionMethod->getParameters() as $parameter) { + $type = $parameter->getType(); + if (!$type) { + throw new Exception('Cannot autowire parameter without type'); + } + $params[] = $this->container->get($type->getName()); + } + + return $params; + } } \ No newline at end of file
2023-08-09 00:49:47 +02:00
#[Route('/view/{name}')]
public function view(string $name): ViewInterface
{
2023-08-15 13:37:03 +02:00
return new BaseView('/home', ['name' => $name]);
}
Finalize routing with injection and parameters diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php index 7f2af8b..86c5b8e 100644 --- a/app/Controller/HelloWorldController.php +++ b/app/Controller/HelloWorldController.php @@ -28,13 +28,13 @@ class HelloWorldController return new GenericResponse('Hello World!'); } - #[Route('/routes')] - public function routes(RouterConfig $config): ResponseInterface + #[Route('/routes/{word}')] + public function routes(RouterConfig $config, string $word): ResponseInterface { $routes = implode('<br>', array_map( - fn($route) => sprintf('%s - %s->%s', $route->getRoute()->path, $route->getController(), $route->getMethod()), - $config->getRoutes() - )); + fn($route) => sprintf('%s - %s->%s', $route->getRoute()->path, $route->getController(), $route->getMethod()), + $config->getRoutes() + )) . "<br>$word"; return new GenericResponse($routes); } diff --git a/src/Container/ContainerInterface.php b/src/Container/ContainerInterface.php index 7b55a94..5119eb5 100644 --- a/src/Container/ContainerInterface.php +++ b/src/Container/ContainerInterface.php @@ -19,4 +19,6 @@ interface ContainerInterface * @throws ClassNotFoundException */ public function get(string $className): object; + + public function call(string $className, string $methodName, array $parameters = []): mixed; } \ No newline at end of file diff --git a/src/Container/GenericContainer.php b/src/Container/GenericContainer.php index 8fdb26e..0e467b6 100644 --- a/src/Container/GenericContainer.php +++ b/src/Container/GenericContainer.php @@ -2,8 +2,10 @@ namespace Ardent\Undercurrent\Container; +use Ardent\Undercurrent\Http\RouteConfig; use Exception; use ReflectionClass; +use ReflectionMethod; class GenericContainer implements ContainerInterface { @@ -61,23 +63,39 @@ class GenericContainer implements ContainerInterface return $instance; } + public function call(string $className, string $methodName, array $parameters = []): mixed + { + $params = $this->methodParams($className, $methodName, $parameters) + $parameters; + return $this->get($className)->$methodName(...$params); + } + private function autowire(string $className): ?object { $reflection = new ReflectionClass($className); - $constructor = $reflection->getConstructor(); - if (!$constructor) { + $reflectionMethod = $reflection->getConstructor(); + if (!$reflectionMethod) { return new $className(); } + return new $className(...$this->methodParams($className, $reflectionMethod->getName())); + } + + private function methodParams(string $className, string $methodName, array $exceptParams = []): array + { + $reflectionMethod = new ReflectionMethod($className, $methodName); + $params = []; - foreach ($constructor->getParameters() as $parameter) { + foreach ($reflectionMethod->getParameters() as $parameter) { + if (in_array($parameter->getName(), array_keys($exceptParams))) { + continue; + } $type = $parameter->getType(); if (!$type) { - throw new Exception("Parameter {$parameter->getName()} in $className has no type"); + throw new Exception('Cannot autowire parameter without type'); } $params[] = $this->get($type->getName()); } - return new $className(...$params); + return $params; } } \ No newline at end of file diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index d5ffb95..334ecac 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -17,7 +17,7 @@ class GenericRouter implements RouterInterface } /** - * @throws RouteNotFoundException|ClassNotFoundException + * @throws RouteNotFoundException */ public function dispatch(RequestInterface $request): ResponseInterface { @@ -28,11 +28,11 @@ class GenericRouter implements RouterInterface continue; } - $controller = $this->container->get($route->getController()); - $method = $route->getMethod(); -// $params = $this->autowire($route) + $this->resolveParams($route->getRoute()->path, $request->getUri()); - $params = $this->resolveParams($route->getRoute()->path, $request->getUri()); - return $controller->$method(...$params); + return $this->container->call( + $route->getController(), + $route->getMethod(), + $params, + ); } throw new RouteNotFoundException($request); @@ -40,6 +40,10 @@ class GenericRouter implements RouterInterface private function resolveParams(string $routeUri, string $requestUri): ?array { + if ($routeUri === $requestUri) { + return []; + } + $result = preg_match_all('/{(\w+)}/', $routeUri, $tokens); if (!$result) { @@ -55,27 +59,11 @@ class GenericRouter implements RouterInterface ) . '$/'; $result = preg_match($matchingRegex, $requestUri, $matches); - if ($result === 0) { - return []; + if (!$result) { + return null; } $matches = array_slice($matches, 1); return array_combine(array_map(fn($token) => trim($token, '{}'), $tokens), $matches); } - - private function autowire(RouteConfig $route): array - { - $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod()); - - $params = []; - foreach ($reflectionMethod->getParameters() as $parameter) { - $type = $parameter->getType(); - if (!$type) { - throw new Exception('Cannot autowire parameter without type'); - } - $params[] = $this->container->get($type->getName()); - } - - return $params; - } } \ No newline at end of file
2023-08-10 17:57:25 +02:00
#[Route('/routes/{word}')]
public function routes(RouterConfig $config, string $word): ResponseInterface
Add controller method autowiring diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php index 8361e9d..282a990 100644 --- a/app/Controller/HelloWorldController.php +++ b/app/Controller/HelloWorldController.php @@ -5,6 +5,7 @@ namespace App\Controller; use Ardent\Undercurrent\Attribute\Route; use Ardent\Undercurrent\Http\GenericResponse; use Ardent\Undercurrent\Http\ResponseInterface; +use Ardent\Undercurrent\Http\RouterConfig; use Ardent\Undercurrent\Http\StatusEnum; class HelloWorldController @@ -26,4 +27,21 @@ class HelloWorldController { return new GenericResponse('Hello World!'); } + + #[Route('/routes')] + public function routes(RouterConfig $config): ResponseInterface + { + $routes = implode('<br>', array_map( + fn($route) => $route->getRoute()->path, + $config->getRoutes() + )); + + return new GenericResponse($routes); + } + + #[Route('/world/{name}')] + public function world(string $name): ResponseInterface + { + return new GenericResponse("Hello $name!"); + } } \ No newline at end of file diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index b2d8e1d..23e9311 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -4,6 +4,8 @@ namespace Ardent\Undercurrent\Http; use Ardent\Undercurrent\Container\ClassNotFoundException; use Ardent\Undercurrent\Container\ContainerInterface; +use Exception; +use ReflectionMethod; class GenericRouter implements RouterInterface { @@ -23,10 +25,26 @@ class GenericRouter implements RouterInterface if ($route->getRoute()->path === $request->getUri()) { $controller = $this->container->get($route->getController()); $method = $route->getMethod(); - return $controller->$method(); + return $controller->$method(...$this->autowire($route)); } } throw new RouteNotFoundException($request); } + + private function autowire(RouteConfig $route): array + { + $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod()); + + $params = []; + foreach ($reflectionMethod->getParameters() as $parameter) { + $type = $parameter->getType(); + if (!$type) { + throw new Exception('Cannot autowire parameter without type'); + } + $params[] = $this->container->get($type->getName()); + } + + return $params; + } } \ No newline at end of file
2023-08-09 00:49:47 +02:00
{
$routes = implode('<br>', array_map(
Finalize routing with injection and parameters diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php index 7f2af8b..86c5b8e 100644 --- a/app/Controller/HelloWorldController.php +++ b/app/Controller/HelloWorldController.php @@ -28,13 +28,13 @@ class HelloWorldController return new GenericResponse('Hello World!'); } - #[Route('/routes')] - public function routes(RouterConfig $config): ResponseInterface + #[Route('/routes/{word}')] + public function routes(RouterConfig $config, string $word): ResponseInterface { $routes = implode('<br>', array_map( - fn($route) => sprintf('%s - %s->%s', $route->getRoute()->path, $route->getController(), $route->getMethod()), - $config->getRoutes() - )); + fn($route) => sprintf('%s - %s->%s', $route->getRoute()->path, $route->getController(), $route->getMethod()), + $config->getRoutes() + )) . "<br>$word"; return new GenericResponse($routes); } diff --git a/src/Container/ContainerInterface.php b/src/Container/ContainerInterface.php index 7b55a94..5119eb5 100644 --- a/src/Container/ContainerInterface.php +++ b/src/Container/ContainerInterface.php @@ -19,4 +19,6 @@ interface ContainerInterface * @throws ClassNotFoundException */ public function get(string $className): object; + + public function call(string $className, string $methodName, array $parameters = []): mixed; } \ No newline at end of file diff --git a/src/Container/GenericContainer.php b/src/Container/GenericContainer.php index 8fdb26e..0e467b6 100644 --- a/src/Container/GenericContainer.php +++ b/src/Container/GenericContainer.php @@ -2,8 +2,10 @@ namespace Ardent\Undercurrent\Container; +use Ardent\Undercurrent\Http\RouteConfig; use Exception; use ReflectionClass; +use ReflectionMethod; class GenericContainer implements ContainerInterface { @@ -61,23 +63,39 @@ class GenericContainer implements ContainerInterface return $instance; } + public function call(string $className, string $methodName, array $parameters = []): mixed + { + $params = $this->methodParams($className, $methodName, $parameters) + $parameters; + return $this->get($className)->$methodName(...$params); + } + private function autowire(string $className): ?object { $reflection = new ReflectionClass($className); - $constructor = $reflection->getConstructor(); - if (!$constructor) { + $reflectionMethod = $reflection->getConstructor(); + if (!$reflectionMethod) { return new $className(); } + return new $className(...$this->methodParams($className, $reflectionMethod->getName())); + } + + private function methodParams(string $className, string $methodName, array $exceptParams = []): array + { + $reflectionMethod = new ReflectionMethod($className, $methodName); + $params = []; - foreach ($constructor->getParameters() as $parameter) { + foreach ($reflectionMethod->getParameters() as $parameter) { + if (in_array($parameter->getName(), array_keys($exceptParams))) { + continue; + } $type = $parameter->getType(); if (!$type) { - throw new Exception("Parameter {$parameter->getName()} in $className has no type"); + throw new Exception('Cannot autowire parameter without type'); } $params[] = $this->get($type->getName()); } - return new $className(...$params); + return $params; } } \ No newline at end of file diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index d5ffb95..334ecac 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -17,7 +17,7 @@ class GenericRouter implements RouterInterface } /** - * @throws RouteNotFoundException|ClassNotFoundException + * @throws RouteNotFoundException */ public function dispatch(RequestInterface $request): ResponseInterface { @@ -28,11 +28,11 @@ class GenericRouter implements RouterInterface continue; } - $controller = $this->container->get($route->getController()); - $method = $route->getMethod(); -// $params = $this->autowire($route) + $this->resolveParams($route->getRoute()->path, $request->getUri()); - $params = $this->resolveParams($route->getRoute()->path, $request->getUri()); - return $controller->$method(...$params); + return $this->container->call( + $route->getController(), + $route->getMethod(), + $params, + ); } throw new RouteNotFoundException($request); @@ -40,6 +40,10 @@ class GenericRouter implements RouterInterface private function resolveParams(string $routeUri, string $requestUri): ?array { + if ($routeUri === $requestUri) { + return []; + } + $result = preg_match_all('/{(\w+)}/', $routeUri, $tokens); if (!$result) { @@ -55,27 +59,11 @@ class GenericRouter implements RouterInterface ) . '$/'; $result = preg_match($matchingRegex, $requestUri, $matches); - if ($result === 0) { - return []; + if (!$result) { + return null; } $matches = array_slice($matches, 1); return array_combine(array_map(fn($token) => trim($token, '{}'), $tokens), $matches); } - - private function autowire(RouteConfig $route): array - { - $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod()); - - $params = []; - foreach ($reflectionMethod->getParameters() as $parameter) { - $type = $parameter->getType(); - if (!$type) { - throw new Exception('Cannot autowire parameter without type'); - } - $params[] = $this->container->get($type->getName()); - } - - return $params; - } } \ No newline at end of file
2023-08-10 17:57:25 +02:00
fn($route) => sprintf('%s - %s->%s', $route->getRoute()->path, $route->getController(), $route->getMethod()),
$config->getRoutes()
)) . "<br>$word";
Add controller method autowiring diff --git a/app/Controller/HelloWorldController.php b/app/Controller/HelloWorldController.php index 8361e9d..282a990 100644 --- a/app/Controller/HelloWorldController.php +++ b/app/Controller/HelloWorldController.php @@ -5,6 +5,7 @@ namespace App\Controller; use Ardent\Undercurrent\Attribute\Route; use Ardent\Undercurrent\Http\GenericResponse; use Ardent\Undercurrent\Http\ResponseInterface; +use Ardent\Undercurrent\Http\RouterConfig; use Ardent\Undercurrent\Http\StatusEnum; class HelloWorldController @@ -26,4 +27,21 @@ class HelloWorldController { return new GenericResponse('Hello World!'); } + + #[Route('/routes')] + public function routes(RouterConfig $config): ResponseInterface + { + $routes = implode('<br>', array_map( + fn($route) => $route->getRoute()->path, + $config->getRoutes() + )); + + return new GenericResponse($routes); + } + + #[Route('/world/{name}')] + public function world(string $name): ResponseInterface + { + return new GenericResponse("Hello $name!"); + } } \ No newline at end of file diff --git a/src/Http/GenericRouter.php b/src/Http/GenericRouter.php index b2d8e1d..23e9311 100644 --- a/src/Http/GenericRouter.php +++ b/src/Http/GenericRouter.php @@ -4,6 +4,8 @@ namespace Ardent\Undercurrent\Http; use Ardent\Undercurrent\Container\ClassNotFoundException; use Ardent\Undercurrent\Container\ContainerInterface; +use Exception; +use ReflectionMethod; class GenericRouter implements RouterInterface { @@ -23,10 +25,26 @@ class GenericRouter implements RouterInterface if ($route->getRoute()->path === $request->getUri()) { $controller = $this->container->get($route->getController()); $method = $route->getMethod(); - return $controller->$method(); + return $controller->$method(...$this->autowire($route)); } } throw new RouteNotFoundException($request); } + + private function autowire(RouteConfig $route): array + { + $reflectionMethod = new ReflectionMethod($route->getController(), $route->getMethod()); + + $params = []; + foreach ($reflectionMethod->getParameters() as $parameter) { + $type = $parameter->getType(); + if (!$type) { + throw new Exception('Cannot autowire parameter without type'); + } + $params[] = $this->container->get($type->getName()); + } + + return $params; + } } \ No newline at end of file
2023-08-09 00:49:47 +02:00
return new GenericResponse($routes);
}
#[Route('/world/{name}')]
public function world(string $name): ResponseInterface
{
return new GenericResponse("Hello $name!");
}
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
2023-08-08 17:18:18 +02:00
}