/** * @param ServerRequestInterface $request * * @return $this */ public function route(ServerRequestInterface $request) { /** @var Route[] $routes */ $routes = array_reverse($this->routes); foreach ($routes as $route) { $path = $request->getUri()->getPath(); $baseUri = $this->getOption('baseUri', ''); $len = strlen($baseUri); if ($len > 0) { if (strncmp($baseUri, $path, $len) !== 0) { continue; } $path = substr($path, $len); } if (empty($path)) { $path = '/'; } $vars = null; if (!in_array($request->getMethod(), $route->getMethods()) || ($vars = $route->match($path)) === false) { continue; } $subRequest = $request; foreach ($vars as $key => $value) { $subRequest = $subRequest->withAttribute($key, $value); } $this->app->prepend(function ($request, $response, $next) use($route, $subRequest) { $handler = $this->app->prepareMiddleware($route->getHandler()); return $handler($subRequest, $response, $next); }); } return $this; }