requestStack = $requestStack; $this->moduleHandler = $module_handler; $this->entityTypeManager = $entity_type_manager; $this->domainStorage = $this->entityTypeManager->getStorage('domain'); $this->configFactory = $config_factory; } /** * {@inheritdoc} */ public function setRequestDomain($httpHost, $reset = FALSE) { // @TODO: Investigate caching methods. $this->setHttpHost($httpHost); // Try to load a direct match. if ($domain = $this->domainStorage->loadByHostname($httpHost)) { // If the load worked, set an exact match flag for the hook. $domain->setMatchType(self::DOMAIN_MATCH_EXACT); } // If a straight load fails, create a base domain for checking. This data // is required for hook_domain_request_alter(). else { $values = ['hostname' => $httpHost]; /** @var \Drupal\domain\DomainInterface $domain */ $domain = $this->domainStorage->create($values); $domain->setMatchType(self::DOMAIN_MATCH_NONE); } // Make sure all modules are loaded and can alter the found domains. // See https://www.drupal.org/node/2896434#comment-12267208. $this->moduleHandler->reload(); foreach ($this->moduleHandler->getImplementations('domain_request_alter') as $module) { $this->moduleHandler->load($module); } // Now check with modules (like Domain Alias) that register alternate // lookup systems with the main module. $this->moduleHandler->alter('domain_request', $domain); // We must have registered a valid id, else the request made no match. if (!empty($domain->id())) { $this->setActiveDomain($domain); } // Fallback to default domain if no match. elseif ($domain = $this->domainStorage->loadDefaultDomain()) { $this->moduleHandler->alter('domain_request', $domain); $domain->setMatchType(self::DOMAIN_MATCH_NONE); if (!empty($domain->id())) { $this->setActiveDomain($domain); } } } /** * {@inheritdoc} */ public function setActiveDomain(DomainInterface $domain) { // @TODO: caching $this->domain = $domain; } /** * Determine the active domain. */ protected function negotiateActiveDomain() { $httpHost = $this->negotiateActiveHostname(); $this->setRequestDomain($httpHost); return $this->domain; } /** * {@inheritdoc} */ public function getActiveDomain($reset = FALSE) { if ($reset) { $this->negotiateActiveDomain(); } return $this->domain; } /** * {@inheritdoc} */ public function getActiveId() { return $this->domain->id(); } /** * {@inheritdoc} */ public function negotiateActiveHostname() { if ($request = $this->requestStack->getCurrentRequest()) { $httpHost = $request->getHttpHost(); } else { $httpHost = $_SERVER['HTTP_HOST']; } $hostname = !empty($httpHost) ? $httpHost : 'localhost'; return $this->domainStorage->prepareHostname($hostname); } /** * {@inheritdoc} */ public function setHttpHost($httpHost) { $this->httpHost = $httpHost; } /** * {@inheritdoc} */ public function getHttpHost() { return $this->httpHost; } /** * {@inheritdoc} */ public function isRegisteredDomain($hostname) { // Direct hostname match always passes. if ($domain = $this->domainStorage->loadByHostname($hostname)) { return TRUE; } // Check for registered alias matches. $values = ['hostname' => $hostname]; /** @var \Drupal\domain\DomainInterface $domain */ $domain = $this->domainStorage->create($values); $domain->setMatchType(self::DOMAIN_MATCH_NONE); // Now check with modules (like Domain Alias) that register alternate // lookup systems with the main module. $this->moduleHandler->alter('domain_request', $domain); // We must have registered a valid id, else the request made no match. if (!empty($domain->id())) { return TRUE; } return FALSE; } }