/** * @param string $name * @param array $data * @param bool $warnData * * @return Uri */ public function getUri(string $name, array $data = [], $warnData = true) : Uri { if (!isset($this->routes[$name])) { throw new \InvalidArgumentException(sprintf("Invalid route name '%s'", $name)); } $route = $this->routes[$name]; $uri = new Uri(); $uri->removeAllQueries()->setFragment(null)->setPath($this->routeRegexp($route, $data)); // $cloneData = $data; // append querystring if ($route->getUserInputs()) { $queryToAdd = []; foreach ($route->getUserInputs() as $querystring) { if (!isset($data[$querystring->getName()]) && $querystring->isMandatory() && $warnData && $route->getMethod() != 'POST' && $route->getMethod() != 'PUT' && $route->getMethod() != 'DELETE') { throw new \InvalidArgumentException(sprintf("Missing querystring '%s' to generate route '%s'", $querystring->getName(), $route->getName())); } if (isset($data[$querystring->getName()])) { // unset($cloneData[$querystring->getName()]); $queryToAdd[$querystring->getName()] = $data[$querystring->getName()]; } } $uri->addQueries($queryToAdd); } /* // Args can be consumed by routeRegexp and not remove from cloneData if (sizeof($cloneData)) { throw new \InvalidArgumentException(sprintf( "Too many data to generate route '%s' with keys %s", $route->getName(), "'" . implode("', '", array_keys($cloneData)) . "'" )); } */ return $uri; }