diff options
| author | Daniel Weipert <git@mail.dweipert.de> | 2026-02-19 14:52:15 +0100 |
|---|---|---|
| committer | Daniel Weipert <git@mail.dweipert.de> | 2026-02-19 14:52:15 +0100 |
| commit | aa908ab7bd03818a2cb1f9b4686034f08736d1cb (patch) | |
| tree | d677fece0783b9ffe629ef881d1913df23b11f8b /src/Router/Router.php | |
Diffstat (limited to 'src/Router/Router.php')
| -rw-r--r-- | src/Router/Router.php | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/Router/Router.php b/src/Router/Router.php new file mode 100644 index 0000000..d770f15 --- /dev/null +++ b/src/Router/Router.php @@ -0,0 +1,68 @@ +<?php + +namespace ERPHP\Router; + +use ERPHP\Hook; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Matcher\UrlMatcher; +use Symfony\Component\Routing\RequestContext; +use Symfony\Component\Routing\RouteCollection; + +class Router +{ + private RouteCollection $routes; + + private static self $instance; + + public static function getInstance(): self + { + if (! isset(self::$instance)) { + self::$instance = new self(); + } + + return self::$instance; + } + + public function __construct() + { + $this->routes = new RouteCollection(); + } + + public function run(): void + { + // get defined routes + $routeFiles = []; + $routeFiles = Hook::applyFilter("Router::getRouteFiles", $routeFiles); + + foreach ($routeFiles as $routesFile) { + /** @var RoutesDefinitionInterface $routesDefinition */ + $routesDefinition = include $routesFile; + $routes = $routesDefinition->get(); + + foreach ($routes as $route) { + /** @var Route[] $route */ + if (! is_null($this->routes->get($route->getName()))) { + throw new \Exception("Route \"{$route->getName()}\" already defined."); + } + + $this->routes->add($route->getName(), $route); + } + } + + $request = Request::createFromGlobals(); + $response = new Response(); + + // set semantically correct request method + if ($request->get("_method", false)) { + $request->setMethod($request->get("_method")); + } + + $matcher = new UrlMatcher($this->routes, new RequestContext()); + $match = $matcher->matchRequest($request); + + /** @var Response $response */ + $response = call_user_func_array($match["_"]["action"], [$request]); + $response->send(); + } +} |
