mirror of
https://github.com/flarum/core.git
synced 2025-07-27 11:40:24 +02:00
68 lines
1.6 KiB
PHP
68 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace Flarum\Http;
|
|
|
|
use FastRoute\Dispatcher;
|
|
use FastRoute\RouteParser;
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
|
|
class RouterMiddleware
|
|
{
|
|
/**
|
|
* @var RouteCollection
|
|
*/
|
|
protected $routes;
|
|
|
|
/**
|
|
* @var Dispatcher
|
|
*/
|
|
protected $dispatcher;
|
|
|
|
/**
|
|
* Create the middleware instance.
|
|
*
|
|
* @param RouteCollection $routes
|
|
*/
|
|
public function __construct(RouteCollection $routes)
|
|
{
|
|
$this->routes = $routes;
|
|
}
|
|
|
|
/**
|
|
* Dispatch the given request to our route collection.
|
|
*
|
|
* @param Request $request
|
|
* @param Response $response
|
|
* @param callable $out
|
|
* @return Response
|
|
* @throws RouteNotFoundException
|
|
*/
|
|
public function __invoke(Request $request, Response $response, callable $out = null)
|
|
{
|
|
$method = $request->getMethod();
|
|
$uri = $request->getUri()->getPath();
|
|
|
|
$routeInfo = $this->getDispatcher()->dispatch($method, $uri);
|
|
|
|
switch ($routeInfo[0]) {
|
|
case Dispatcher::NOT_FOUND:
|
|
case Dispatcher::METHOD_NOT_ALLOWED:
|
|
throw new RouteNotFoundException;
|
|
case Dispatcher::FOUND:
|
|
$handler = $routeInfo[1];
|
|
$parameters = $routeInfo[2];
|
|
|
|
return $handler($request, $parameters);
|
|
}
|
|
}
|
|
|
|
protected function getDispatcher()
|
|
{
|
|
if (! isset($this->dispatcher)) {
|
|
$this->dispatcher = new Dispatcher\GroupCountBased($this->routes->getRouteData());
|
|
}
|
|
|
|
return $this->dispatcher;
|
|
}
|
|
} |