public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
{
$siteAccess = $this->siteAccess;
$originalContext = $context = $this->getContext();
$isSiteAccessAware = $this->isSiteAccessAwareRoute($name);
// Retrieving the appropriate SiteAccess to generate the link for.
if (isset($parameters['siteaccess']) && $isSiteAccessAware) {
$siteAccess = $this->siteAccessRouter->matchByName($parameters['siteaccess']);
if ($siteAccess instanceof SiteAccess && $siteAccess->matcher instanceof SiteAccess\VersatileMatcher) {
// Switch request context for link generation.
$context = $this->getContextBySimplifiedRequest($siteAccess->matcher->getRequest());
$this->setContext($context);
} elseif ($this->logger) {
$siteAccess = $this->siteAccess;
$this->logger->notice("Could not generate a link using provided 'siteaccess' parameter: {$parameters['siteaccess']}. Generating using current context.");
}
unset($parameters['siteaccess']);
}
$url = parent::generate($name, $parameters, $referenceType);
// Now putting back SiteAccess URI if needed.
if ($isSiteAccessAware && $siteAccess && $siteAccess->matcher instanceof URILexer) {
if ($referenceType === self::ABSOLUTE_URL || $referenceType === self::NETWORK_PATH) {
$scheme = $context->getScheme();
$port = '';
if ($scheme === 'http' && $this->context->getHttpPort() != 80) {
$port = ':' . $this->context->getHttpPort();
} elseif ($scheme === 'https' && $this->context->getHttpsPort() != 443) {
$port = ':' . $this->context->getHttpsPort();
}
$base = $context->getHost() . $port . $context->getBaseUrl();
} else {
$base = $context->getBaseUrl();
}
$linkUri = $base ? substr($url, strpos($url, $base) + strlen($base)) : $url;
$url = str_replace($linkUri, $siteAccess->matcher->analyseLink($linkUri), $url);
}
// Switch back to original context, for next links generation.
$this->setContext($originalContext);
return $url;
}