/** * Mount router under prefix query * * @param $prefix * @param RouterInterface $router * @param array $meta * @return $this */ public function mount($prefix, RouterInterface $router, array $meta = []) { $prefix = '/' . trim($prefix, '/'); foreach ($router->routes() as $route) { $route->uri = $prefix . $route->uri; $route->meta = array_merge($route->meta, $meta); $query = static::clean($route->method . ' ' . $route->uri); $this->routes[$query] = $route; } return $this; }
/** * Handle context * * @param Context $context * @param callable $chain * @return Response * * @throws NotFoundException */ public function handle(Context $context, callable $chain = null) { // ask specific resource if ($context->forward) { list($callable, $params) = $context->forward; $context->invokable = $this->resolve($callable, $params); $context->forward = null; } elseif (!$context->invokable) { $query = $context->request->method . ' ' . $context->request->uri->path; $route = $this->router->find($query); if (!$route) { throw new NotFoundException('No route corresponding to query ' . $query); } $context->route = $route; $context->invokable = $this->resolve($route->resource, $route->params); } return $chain($context); }
/** * Find route from context * * @param Context $context * @return Context * * @throws NotFoundException */ protected function route(Context $context) { $this->logger->debug('kernel.route: find route from http query'); // logic already specified if ($context->logic) { $this->logger->debug('kernel.route: forward to #' . $context->logic->name . ', skip routing'); return $context; } // find route $query = $context->request->method . ' ' . $context->request->uri->path; $route = $this->router->find($query); // 404 if (!$route) { throw new NotFoundException('No route found for query ' . $query); } // update context $context->route = $route; $context->params = $route->params; $context->logic = $route->resource; $this->logger->debug('kernel.route: #' . $context->logic->name . ' found for query ' . $query); return $context; }