/** * Replaces parameters in path template with their values from restriction. * * @param string $pathTemplate * @param Restriction $restriction * @returns string * @throws InvalidArgumentException when some mandatory parameter is missing in restriction */ public function build($pathTemplate, Restriction $restriction) { $matches = []; preg_match_all("/\\{(.*?)\\}/", $pathTemplate, $matches); $matchedParameters = end($matches); $required = []; $parameters = []; foreach ($matchedParameters as $parameter) { if (substr($parameter, 0, 1) == '?') { $parameters = explode(',', str_replace('?', '', $parameter)); } else { if (($p = $restriction->getParameter($parameter)) === NULL) { $required[] = $parameter; } else { $pathTemplate = str_replace('{' . $parameter . '}', $p, $pathTemplate); } } } if (!empty($required)) { $message = 'Empty required parameters: ' . implode(', ', $required); throw new InvalidArgumentException($message); } if (($pos = strpos($pathTemplate, '{?')) !== FALSE) { $pathTemplate = substr($pathTemplate, 0, $pos); $first = TRUE; foreach ($parameters as $qParameter) { $p = $restriction->getParameter($qParameter); if ($p !== NULL) { $pathTemplate .= ($first ? '?' : '&') . $qParameter . '=' . rawurlencode($p); $first = FALSE; } } } return $pathTemplate; }
/** * @param Restriction $restriction * @param string $name * @param mixed|NULL $value * @return void */ protected function addParameterIfNotNull(Restriction $restriction, $name, $value) { if ($value !== NULL) { $restriction->addParameter($name, $value); } }