/** * @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); }
public function testMultipleGroup() { $router = new Router(); $router->get('', 'index@Main'); $router->group(['prefix' => '/admin', 'middleware' => ['auth@Admin']], function () use($router) { $router->group(['prefix' => '/member', 'middleware' => ['member@Admin']], function () use($router) { $router->get('/', 'index@AdminMember'); $router->get('', 'index@AdminMember'); }); }); $routes = $router->getRoutes(); $this->assertTrue(isset($routes['GET/'])); $this->assertTrue(isset($routes['GET/admin/member'])); $this->assertTrue(isset($routes['GET/admin/member/'])); $this->assertEquals(1, count($routes['GET/']['handler'])); $this->assertEquals(3, count($routes['GET/admin/member']['handler'])); }