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);
}
}
}
}
