1<?php
2
3namespace Drupal\node\EventSubscriber;
4
5use Drupal\Core\Config\ConfigCrudEvent;
6use Drupal\Core\Config\ConfigEvents;
7use Drupal\Core\Config\ConfigFactoryInterface;
8use Drupal\Core\Routing\RouteBuilderInterface;
9use Drupal\Core\Routing\RouteSubscriberBase;
10use Symfony\Component\Routing\RouteCollection;
11
12/**
13 * Sets the _admin_route for specific node-related routes.
14 */
15class NodeAdminRouteSubscriber extends RouteSubscriberBase {
16
17  /**
18   * The config factory.
19   *
20   * @var \Drupal\Core\Config\ConfigFactoryInterface
21   */
22  protected $configFactory;
23
24  /**
25   * The router builder.
26   *
27   * @var \Drupal\Core\Routing\RouteBuilderInterface
28   */
29  protected $routerBuilder;
30
31  /**
32   * Constructs a new NodeAdminRouteSubscriber.
33   *
34   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
35   *   The config factory.
36   * @param \Drupal\Core\Routing\RouteBuilderInterface $router_builder
37   *   The router builder service.
38   */
39  public function __construct(ConfigFactoryInterface $config_factory, RouteBuilderInterface $router_builder) {
40    $this->configFactory = $config_factory;
41    $this->routerBuilder = $router_builder;
42  }
43
44  /**
45   * {@inheritdoc}
46   */
47  protected function alterRoutes(RouteCollection $collection) {
48    if ($this->configFactory->get('node.settings')->get('use_admin_theme')) {
49      foreach ($collection->all() as $route) {
50        if ($route->hasOption('_node_operation_route')) {
51          $route->setOption('_admin_route', TRUE);
52        }
53      }
54    }
55  }
56
57  /**
58   * Rebuilds the router when node.settings:use_admin_theme is changed.
59   *
60   * @param \Drupal\Core\Config\ConfigCrudEvent $event
61   */
62  public function onConfigSave(ConfigCrudEvent $event) {
63    if ($event->getConfig()->getName() === 'node.settings' && $event->isChanged('use_admin_theme')) {
64      $this->routerBuilder->setRebuildNeeded();
65    }
66  }
67
68  /**
69   * {@inheritdoc}
70   */
71  public static function getSubscribedEvents() {
72    $events = parent::getSubscribedEvents();
73    $events[ConfigEvents::SAVE][] = ['onConfigSave', 0];
74    return $events;
75  }
76
77}
78