/** * @param \Psr\Http\Message\ServerRequestInterface $request * @return \Psr\Http\Message\ResponseInterface */ public function dispatch(ServerRequestInterface $request) { $cacheEnabled = $this->config->isCacheEnabled(); $cacheFile = $this->config->getCacheFile(); if ($cacheEnabled && file_exists($cacheFile)) { $cacheData = (require $cacheFile); $dispatchData = $cacheData['dispatch_data']; $routes = $cacheData['routes']; } else { $router = new Router(); if ($this->routes) { $router->middleware($this->config->getMiddleware(), function (Router $router) { $router->append($this->routes); }); } $dispatchData = $router->getCollector()->getData(); $routes = $router->getRoutes(); } if ($cacheEnabled) { file_put_contents($cacheFile, '<?php return ' . var_export(['dispatch_data' => $dispatchData, 'routes' => $routes], true) . ';'); } $request = $this->applyVirtualMethod($request); $routeInfo = $this->runDispatcher(new GCBDispatcher($dispatchData), $request->getMethod(), $request->getUri()->getPath()); foreach ($routeInfo[2] as $key => $value) { $request = $request->withAttribute($key, $value); } return $routes[$routeInfo[1]]->execute($request, $this->classLoader, $this->responsifier); }