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
This commit is contained in:
parent
5d6ad29db8
commit
64ff0c243d
@ -5,6 +5,7 @@ namespace App\Controller;
|
|||||||
use Ardent\Undercurrent\Attribute\Route;
|
use Ardent\Undercurrent\Attribute\Route;
|
||||||
use Ardent\Undercurrent\Http\GenericResponse;
|
use Ardent\Undercurrent\Http\GenericResponse;
|
||||||
use Ardent\Undercurrent\Http\ResponseInterface;
|
use Ardent\Undercurrent\Http\ResponseInterface;
|
||||||
|
use Ardent\Undercurrent\Http\RouterConfig;
|
||||||
use Ardent\Undercurrent\Http\StatusEnum;
|
use Ardent\Undercurrent\Http\StatusEnum;
|
||||||
|
|
||||||
class HelloWorldController
|
class HelloWorldController
|
||||||
@ -26,4 +27,21 @@ class HelloWorldController
|
|||||||
{
|
{
|
||||||
return new GenericResponse('Hello World!');
|
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!");
|
||||||
|
}
|
||||||
}
|
}
|
@ -4,6 +4,8 @@ namespace Ardent\Undercurrent\Http;
|
|||||||
|
|
||||||
use Ardent\Undercurrent\Container\ClassNotFoundException;
|
use Ardent\Undercurrent\Container\ClassNotFoundException;
|
||||||
use Ardent\Undercurrent\Container\ContainerInterface;
|
use Ardent\Undercurrent\Container\ContainerInterface;
|
||||||
|
use Exception;
|
||||||
|
use ReflectionMethod;
|
||||||
|
|
||||||
class GenericRouter implements RouterInterface
|
class GenericRouter implements RouterInterface
|
||||||
{
|
{
|
||||||
@ -23,10 +25,26 @@ class GenericRouter implements RouterInterface
|
|||||||
if ($route->getRoute()->path === $request->getUri()) {
|
if ($route->getRoute()->path === $request->getUri()) {
|
||||||
$controller = $this->container->get($route->getController());
|
$controller = $this->container->get($route->getController());
|
||||||
$method = $route->getMethod();
|
$method = $route->getMethod();
|
||||||
return $controller->$method();
|
return $controller->$method(...$this->autowire($route));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new RouteNotFoundException($request);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user