diff options
| author | Daniel Weipert <code@drogueronin.de> | 2022-01-14 18:21:36 +0100 | 
|---|---|---|
| committer | Daniel Weipert <code@drogueronin.de> | 2022-01-14 18:21:36 +0100 | 
| commit | 4cacc94240944ff316104bfd1b5e8e00fad14517 (patch) | |
| tree | 2559dc3aa121d70bd645ff0a2fe56e1ae0695daa /src/Router.php | |
| parent | 9c0893cb65df986b9edf0f48a6d4d2d65f27b8ef (diff) | |
Add Artworks, Votes and better routing
Diffstat (limited to 'src/Router.php')
| -rw-r--r-- | src/Router.php | 81 | 
1 files changed, 46 insertions, 35 deletions
| diff --git a/src/Router.php b/src/Router.php index 377c00b..5635d5c 100644 --- a/src/Router.php +++ b/src/Router.php @@ -7,64 +7,75 @@ use Elements\Controller\Home;  use Symfony\Component\HttpFoundation\RedirectResponse;  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\Route; +use Symfony\Component\Routing\RouteCollection;  class Router  { -  private $routes = [ -    'GET' => [ -      '/' => [Home::class, 'index'], -    ], - -    'POST' => [ -      '/card/add' => [Card::class, 'add'], -    ], -  ]; +  private ?RouteCollection $routes; +  private array $routeFunctions = [];    /**     * Router constructor.     */    public function __construct()    { +    /**@var Request $request*/      $request = Request::createFromGlobals();      $response = new Response(); -    $method = $request->getMethod(); -    $path = $request->getPathInfo(); +    $this->routes = new RouteCollection(); +    $this->addRoute('GET', '/', [Home::class,  'index']); +    $this->addRoute('GET', '/card/{id}', [Card::class,  'get']); +    $this->addRoute('POST', '/card/add', [Card::class,  'add']); + +    $context = new RequestContext(); +    $context->fromRequest($request); +    $matcher = new UrlMatcher($this->routes, $context); -    // if the route is defined -    if (isset($this->routes[$method][$path])) { -      try { -	// run controller function -	$content = call_user_func($this->routes[$method][$path], $request); +    try { +      $match = $matcher->match($request->getPathInfo()); +      $request->attributes->set('route', $match); -	// set response to new response -	if ($content instanceof Response) { -	  $response = $content; -	} +      // run controller function +      $content = call_user_func($this->routeFunctions[$match['_route']], $request); -	// set content directly otherwise -	else { -	  $response->setContent($content); -	} +      // set response to new response +      if ($content instanceof Response) { +	$response = $content;        } -      // catch any errors -      catch (AppException $exception) { -	$response->setStatusCode($exception->getCode()); -	$response->setContent($exception->getMessage()); -      } catch (\Exception $exception) { -	$response->setStatusCode(Response::HTTP_BAD_REQUEST); -	$response->setContent($exception->getMessage()); +      // set content directly otherwise +      else { +	$response->setContent($content);        }      } -    // route is not defined -    else { -      $response->setStatusCode(Response::HTTP_NOT_FOUND); -      $response->setContent('Not Found'); +    // catch any errors +    catch (AppException $exception) { +      $response->setStatusCode($exception->getCode()); +      $response->setContent($exception->getMessage()); +    } catch (\Exception $exception) { +      $response->setStatusCode(Response::HTTP_BAD_REQUEST); +      $response->setContent($exception->getMessage());      }      $response->send();    } + +  /** +   * @param string|array $methods +   * @param string $path +   * @param callable $function +   */ +  public function addRoute(string|array $methods, string $path, array $function) +  { +    $name = "$function[0]::$function[1]"; + +    $this->routes->add($name, new Route($path, methods: (array)$methods)); +    $this->routeFunctions[$name] = $function; +  }  } | 
