summaryrefslogtreecommitdiff
path: root/src/Router/Router.php
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2026-02-19 14:52:15 +0100
committerDaniel Weipert <git@mail.dweipert.de>2026-02-19 14:52:15 +0100
commitaa908ab7bd03818a2cb1f9b4686034f08736d1cb (patch)
treed677fece0783b9ffe629ef881d1913df23b11f8b /src/Router/Router.php
initial commitHEADmain
Diffstat (limited to 'src/Router/Router.php')
-rw-r--r--src/Router/Router.php68
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();
+ }
+}