domain_views_display-1.x-dev/src/Routing/RouteSubscriber.php

src/Routing/RouteSubscriber.php
<?php

declare(strict_types=1);

namespace Drupal\domain_views_display\Routing;

use Drupal\Core\DependencyInjection\AutowireTrait;
use Drupal\Core\DependencyInjection\ClassResolverInterface;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Routing\RouteSubscriberBase;
use Drupal\domain_views_display\DomainViewsDisplay;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

/**
 * Alters page response routes that have domain overrides.
 */
class RouteSubscriber extends RouteSubscriberBase implements ContainerInjectionInterface {

  use AutowireTrait;

  /**
   * Creates the subscriber.
   *
   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $classResolver
   *   The class resolver service.
   */
  public function __construct(
    protected readonly ClassResolverInterface $classResolver,
  ) {}

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection): void {
    $domain_views_display = $this->classResolver->getInstanceFromDefinition(DomainViewsDisplay::class);
    assert($domain_views_display instanceof DomainViewsDisplay);
    $alter_displays = $domain_views_display->getViewDisplaysWithOverrides();
    if (!$alter_displays) {
      return;
    }

    foreach ($alter_displays as $view_id => $display_ids) {
      foreach ($display_ids as $display_id) {
        $route = $collection->get("view.$view_id.$display_id");
        if ($route) {
          $this->alterRoute($route);
        }
      }
    }
  }

  /**
   * Alters a route for a view and display that are overridden by domain.
   *
   * @param \Symfony\Component\Routing\Route $route
   *   The route to alter.
   */
  protected function alterRoute(Route $route): void {
    $get_method_mapping = fn(string $method): array => [
      ControllerDecorator::DECORATED_CLASS . '::' . $method => ControllerDecorator::class . '::' . $method,
    ];

    $map = array_map($get_method_mapping, [
      '_controller' => 'handle',
      '_title_callback' => 'getTitle',
    ]);

    foreach ($map as $default => $class_map) {
      $class = $class_map[$route->getDefault($default)] ?? NULL;
      if ($class) {
        $route->setDefault($default, $class);
      }
    }
  }

}

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

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