51 lines
1.7 KiB
PHP
51 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Lean;
|
|
|
|
use League\Route\RouteGroup,
|
|
League\Route\Router;
|
|
|
|
use Psr\Http\Message\ServerRequestInterface,
|
|
Psr\Http\Message\ResponseInterface,
|
|
Psr\Container\ContainerInterface;
|
|
|
|
use Notes\Route\RouteFetcher;
|
|
|
|
use Mcnd\Event\EventManager;
|
|
|
|
class Routing {
|
|
|
|
public ResponseInterface $response;
|
|
|
|
public function __construct(
|
|
public Router $router,
|
|
public RouteFetcher $fetcher,
|
|
public EventManager $eventManager,
|
|
) { }
|
|
|
|
public function registerRoute(ContainerInterface $container, string $urlBase) {
|
|
$this->router->group(rtrim($urlBase, "/"), function (RouteGroup $route) use ($container) {
|
|
foreach($this->fetcher->compile() as $attribute) {
|
|
$this->eventManager->execute(Event\RoutingCompileRoutes::class, $this, $attribute);
|
|
|
|
# Mapping every URLs from attributes in searched folders (Api, Controller, etc...)
|
|
foreach((array) $attribute->method as $method) {
|
|
$route->map(strtoupper($method), $attribute->getRoute(), function (ServerRequestInterface $request, array $arguments) use (
|
|
$container, $route, $attribute
|
|
) : ResponseInterface {
|
|
$class = $attribute->class;
|
|
$method = $attribute->classMethod;
|
|
$object = $container->get($class);
|
|
|
|
$this->eventManager->execute(Event\RoutingMapRoutes::class, $this, $container, $request, $attribute);
|
|
|
|
$container->set(ServerRequestInterface::class, $request);
|
|
|
|
return $this->response ?? $object->$method($request, $arguments);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|