mirror of
https://github.com/flarum/core.git
synced 2025-10-12 15:34:26 +02:00
78 lines
2.0 KiB
PHP
78 lines
2.0 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Flarum.
|
|
*
|
|
* For detailed copyright and license information, please view the
|
|
* LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Flarum\Http\Middleware;
|
|
|
|
use FastRoute\Dispatcher;
|
|
use Flarum\Http\Exception\MethodNotAllowedException;
|
|
use Flarum\Http\Exception\RouteNotFoundException;
|
|
use Flarum\Http\RouteCollection;
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
use Psr\Http\Server\MiddlewareInterface as Middleware;
|
|
use Psr\Http\Server\RequestHandlerInterface as Handler;
|
|
|
|
class DispatchRoute implements Middleware
|
|
{
|
|
/**
|
|
* @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.
|
|
*
|
|
* @throws MethodNotAllowedException
|
|
* @throws RouteNotFoundException
|
|
*/
|
|
public function process(Request $request, Handler $handler): Response
|
|
{
|
|
$method = $request->getMethod();
|
|
$uri = $request->getUri()->getPath() ?: '/';
|
|
|
|
$routeInfo = $this->getDispatcher()->dispatch($method, $uri);
|
|
|
|
switch ($routeInfo[0]) {
|
|
case Dispatcher::NOT_FOUND:
|
|
throw new RouteNotFoundException($uri);
|
|
case Dispatcher::METHOD_NOT_ALLOWED:
|
|
throw new MethodNotAllowedException($method);
|
|
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;
|
|
}
|
|
}
|