You are here

class DomainRedirectRequestSubscriber in Redirect 8

Redirect subscriber for controller requests.

Hierarchy

Expanded class hierarchy of DomainRedirectRequestSubscriber

1 file declares its use of DomainRedirectRequestSubscriber
DomainRedirectRequestSubscriberTest.php in modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php
1 string reference to 'DomainRedirectRequestSubscriber'
redirect_domain.services.yml in modules/redirect_domain/redirect_domain.services.yml
modules/redirect_domain/redirect_domain.services.yml
1 service uses DomainRedirectRequestSubscriber
redirect_domain.request_subscriber in modules/redirect_domain/redirect_domain.services.yml
Drupal\redirect_domain\EventSubscriber\DomainRedirectRequestSubscriber

File

modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php, line 17

Namespace

Drupal\redirect_domain\EventSubscriber
View source
class DomainRedirectRequestSubscriber implements EventSubscriberInterface {

  /**
   * @var \Drupal\redirect\RedirectChecker
   */
  protected $redirectChecker;

  /**
   * Domain redirect configuration.
   *
   * @var \Drupal\Core\Config\Config
   */
  protected $domainConfig;

  /**
   * The path matcher.
   *
   * @var \Drupal\Core\Path\PathMatcherInterface
   */
  protected $pathMatcher;

  /**
   * Redirect configuration.
   *
   * @var \Drupal\Core\Config\Config
   */
  protected $redirectConfig;

  /**
   * Constructs a \Drupal\redirect\EventSubscriber\RedirectRequestSubscriber object.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   * @param \Drupal\redirect\RedirectChecker $redirect_checker
   *   The redirect checker service.
   * @param \Drupal\Core\Path\PathMatcherInterface $path_matcher
   *   The path matcher.
   */
  public function __construct(ConfigFactoryInterface $config_factory, RedirectChecker $redirect_checker, PathMatcherInterface $path_matcher) {
    $this->domainConfig = $config_factory
      ->get('redirect_domain.domains');
    $this->redirectConfig = $config_factory
      ->get('redirect.settings');
    $this->redirectChecker = $redirect_checker;
    $this->pathMatcher = $path_matcher;
  }

  /**
   * Handles the domain redirect if any found.
   *
   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
   *   The event to process.
   */
  public function onKernelRequestCheckDomainRedirect(GetResponseEvent $event) {
    $request = clone $event
      ->getRequest();
    if (!$this->redirectChecker
      ->canRedirect($request)) {
      return;
    }

    // Redirect between domains configuration.
    $domains = $this->domainConfig
      ->get('domain_redirects');
    if (!empty($domains)) {
      $host = $request
        ->getHost();
      $path = $request
        ->getPathInfo();
      $protocol = $request
        ->getScheme() . '://';
      $destination = NULL;

      // Prior to being saved the source domain value has any periods replaced
      // with a colon, which makes it suitable for use as a key. In order to
      // match against those values the current hostname must be similarly
      // converted.
      // @see \Drupal\redirect_domain\Form\RedirectDomainForm::submitForm()
      $converted_host = str_replace('.', ':', $host);

      // Checks if there is a redirect domain in the configuration.
      if (isset($domains[$converted_host])) {
        foreach ($domains[$converted_host] as $item) {
          if ($this->pathMatcher
            ->matchPath($path, $item['sub_path'])) {
            $destination = $item['destination'];
            break;
          }
        }
        if ($destination) {

          // Use the default status code from Redirect.
          $response = new TrustedRedirectResponse($protocol . $destination, $this->redirectConfig
            ->get('default_status_code'));
          $event
            ->setResponse($response);
          return;
        }
      }
    }
  }

  /**
   * Prior to set the response it check if we can redirect.
   *
   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
   *   The event object.
   * @param \Drupal\Core\Url $url
   *   The Url where we want to redirect.
   */
  protected function setResponse(GetResponseEvent $event, Url $url) {
    $request = $event
      ->getRequest();
    parse_str($request
      ->getQueryString(), $query);
    $url
      ->setOption('query', $query);
    $url
      ->setAbsolute(TRUE);
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {

    // This needs to run before RouterListener::onKernelRequest(), which has
    // a priority of 32 and
    // RedirectRequestSubscriber::onKernelRequestCheckRedirect(), which has
    // a priority of 33. Otherwise, that aborts the request if no matching
    // route is found.
    $events[KernelEvents::REQUEST][] = [
      'onKernelRequestCheckDomainRedirect',
      34,
    ];
    return $events;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DomainRedirectRequestSubscriber::$domainConfig protected property Domain redirect configuration.
DomainRedirectRequestSubscriber::$pathMatcher protected property The path matcher.
DomainRedirectRequestSubscriber::$redirectChecker protected property
DomainRedirectRequestSubscriber::$redirectConfig protected property Redirect configuration.
DomainRedirectRequestSubscriber::getSubscribedEvents public static function Returns an array of event names this subscriber wants to listen to.
DomainRedirectRequestSubscriber::onKernelRequestCheckDomainRedirect public function Handles the domain redirect if any found.
DomainRedirectRequestSubscriber::setResponse protected function Prior to set the response it check if we can redirect.
DomainRedirectRequestSubscriber::__construct public function Constructs a \Drupal\redirect\EventSubscriber\RedirectRequestSubscriber object.