Files
public
src
Controller
Entity
Repository
Service
Config.php
Container.php
DatabaseConnection.php
Router.php
Template.php
bootstrap.php
templates
.gitinore
LICENSE
README.md
config.json.sample
addressbook/src/Service/Router.php

46 lines
1.5 KiB
PHP

<?php
namespace App\Service;
use App\Entity\Route;
use Closure;
class Router
{
private array $routes;
/*
* This method takes a route like /admin/users/{user} and create a regex to match on call
*/
function addRoute(string $name, string $route, Closure $callback): void
{
// check for parameters
preg_match_all(pattern: "/(?<={).+?(?=})/", subject: $route, matches: $matches);
$parameters = $matches[0];
// create regex for route:
$regex = preg_replace(pattern: '/(?<={).+?(?=})/', replacement: '(.*?)', subject: $route);
$regex = str_replace(search: '{', replace: '', subject: $regex);
$regex = str_replace(search: '}', replace: '', subject: $regex);
$regex = '/^' . str_replace(search: "/", replace: '\\/', subject: $regex) . '$/i';
$route = new Route(name: $name, route: $route, regEx: $regex, parameters: $parameters, callback: $callback);
$this->routes[] = $route;
}
public function handleRouting(): void
{
$requestUri = $_SERVER['REQUEST_URI'];
foreach ($this->routes as $route) {
if (preg_match(pattern: $route->getRegex(), subject: $requestUri, matches: $matches)) {
$parameters = [];
foreach ($route->getParameters() as $id => $parameter) {
$parameters[$parameter] = $matches[$id +1];
}
call_user_func(callback: $route->getCallback(), args: $parameters);
}
}
}
}