private function generateUrlForBinding(ResourceBinding $binding, $repositoryPath)
{
$serverName = $binding->getParameterValue(self::SERVER_PARAMETER);
if (!isset($this->urlFormats[$serverName])) {
throw new CannotGenerateUrlException(sprintf('The server "%s" mapped for path "%s" does not exist.', $serverName, $repositoryPath));
}
$repoBasePath = Glob::getStaticPrefix($binding->getQuery());
$serverBasePath = trim($binding->getParameterValue(self::PATH_PARAMETER), '/');
// The server path is generated by replacing the base repository path
// (= the path of the binding) by the stored server base path in the
// repository path of the resource.
//
// Example:
//
// resource path: /acme/blog/public/css/style.css
// binding path: /acme/blog/public{,/**/*}
// repo base path: /acme/blog/public
// server base path: /blog
//
// final server path: /blog/css/style.css
$serverPath = substr_replace($repositoryPath, $serverBasePath, 0, strlen($repoBasePath));
// The server path is inserted into the "%s" parameter of the URL format
return sprintf($this->urlFormats[$serverName], ltrim($serverPath, '/'));
}