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();
  }
}