sites_group_overrides-1.x-dev/src/EventSubscriber/ActiveSiteSubscriber.php

src/EventSubscriber/ActiveSiteSubscriber.php
<?php

declare(strict_types=1);

namespace Drupal\sites_group_overrides\EventSubscriber;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\sites\Event\ActiveSite;
use Drupal\sites\SitePluginManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Subscribes on the active site event.
 */
class ActiveSiteSubscriber implements EventSubscriberInterface {

  /**
   * The current request.
   *
   * @var \Symfony\Component\HttpFoundation\Request
   */
  protected Request $request;

  /**
   * Constructs a ActiveSiteSubscriber object.
   *
   * @param \Drupal\Core\Session\AccountInterface $account
   *   The current user account.
   * @param \Drupal\sites\SitePluginManagerInterface $sitePluginManager
   *   The site plugin manager.
   * @param \Drupal\Core\Access\CsrfTokenGenerator $csrfToken
   *   The token generator.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   A request stack symfony instance.
   */
  public function __construct(
    protected readonly AccountInterface $account,
    protected readonly SitePluginManagerInterface $sitePluginManager,
    protected readonly CsrfTokenGenerator $csrfToken,
    RequestStack $request_stack,
  ) {
    $this->request = $request_stack->getCurrentRequest();
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      ActiveSite::SITES_ACTIVE_SITE => ['onMasquerade', 1100],
    ];
  }

  /**
   * Makes sure the site context remains when submitting a form.
   *
   * @param \Drupal\sites\Event\ActiveSite $event
   *   The sites' event.
   */
  public function onMasquerade(ActiveSite $event) {
    if (!$csrf_token = $this->request->request->get('sites_csrf')) {
      return;
    }
    if (!$this->csrfToken->validate($csrf_token, 'sites_csrf')) {
      return;
    }
    if ($site_id = $this->request->request->get('site_id')) {
      if ($site = $this->sitePluginManager->getSite($site_id)) {
        $event->setActiveSite($site);
      }
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc