Dodajemy do naszego routera możliwość dodawania globalnego middleware oraz middleware dla konkretnych ścieżek. Do dzieła.
Middleware globalny będzie trzymany jako pole klasy router:
class Router {
private array $routes = [];
private array $middlewares = [];
//(...)
public function addMiddleware(string $middleware)
{
$this->middlewares[] = $middleware;
}
}
Nic trudnego. Teraz zobaczmy, jak wygląda metoda add:
class Router {
private array $routes = [];
private array $middlewares = [];
//(...)
public function add(string $method, string $path, array $controller)
{
$path = $this->normalizePath($path);
$regexPath = preg_replace('#{[^/]+}#', '([^/]+)', $path);
$this->routes[] = [
'path' => $path,
'method' => strtoupper($method),
'controller' => $controller,
'middlewares' => [],
'regexPath' => $regexPath
];
}
//(...)
}
Każdy route ma pod kluczem 'middlewares’ pustą tablicę. Możemy do niej dodawać middlewary. Pytanie tylko, do którego route mamy je dodawać?
Szczerze, w tej „edycji” routera bazuję akurat na istniejącym na githubie projekcie (choć nasz MVC projekt będzie dużo bardziej rozbudowany, docelowo bazujący na Laravelu, z warstwami abstrakcji dla response, request, także dla route) i tam rozwiązali to tak: dodajesz, znaczy, że do ostatnio dodanego route chcesz middleware dopisać…
class Router {
private array $routes = [];
private array $middlewares = [];
//(...)
public function addRouteMiddleware(string $middleware)
{
$lastRouteKey = array_key_last($this->routes);
$this->routes[$lastRouteKey]['middlewares'][] = $middleware;
}
}
Dopiszmy sobie jeszcze middlewary, zaś metodą dispatch zajmiemy się na następnej lekcji:
interface MiddlewareInterface
{
public function process(callable $next);
}
class StupidMiddleware implements MiddlewareInterface
{
public function process(callable $next)
{
echo "This is stupid middleware speaking on all routes <br>";
$next();
}
}
class StupidRouteMiddleware implements MiddlewareInterface
{
public function process(callable $next)
{
echo "This is stupid route middleware speakin on this route! <br>";
$next();
}
}