Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\Routing;
|
Chris@0
|
4
|
Chris@0
|
5 use Symfony\Cmf\Component\Routing\PagedRouteProviderInterface;
|
Chris@12
|
6 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
Chris@0
|
7 use Symfony\Component\HttpFoundation\Request;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * A Route Provider front-end for all Drupal-stored routes.
|
Chris@0
|
11 */
|
Chris@12
|
12 class RouteProviderLazyBuilder implements PreloadableRouteProviderInterface, PagedRouteProviderInterface, EventSubscriberInterface {
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * The route provider service.
|
Chris@0
|
16 *
|
Chris@0
|
17 * @var \Drupal\Core\Routing\RouteProviderInterface
|
Chris@0
|
18 */
|
Chris@0
|
19 protected $routeProvider;
|
Chris@0
|
20
|
Chris@0
|
21 /**
|
Chris@0
|
22 * The route building service.
|
Chris@0
|
23 *
|
Chris@0
|
24 * @var \Drupal\Core\Routing\RouteBuilderInterface
|
Chris@0
|
25 */
|
Chris@0
|
26 protected $routeBuilder;
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * Flag to determine if the router has been rebuilt.
|
Chris@0
|
30 *
|
Chris@0
|
31 * @var bool
|
Chris@0
|
32 */
|
Chris@0
|
33 protected $rebuilt = FALSE;
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@12
|
36 * Flag to determine if router is currently being rebuilt.
|
Chris@12
|
37 *
|
Chris@12
|
38 * Used to prevent recursive router rebuilds during module installation.
|
Chris@12
|
39 * Recursive rebuilds can occur when route information is required by alter
|
Chris@12
|
40 * hooks that are triggered during a rebuild, for example,
|
Chris@12
|
41 * hook_menu_links_discovered_alter().
|
Chris@12
|
42 *
|
Chris@12
|
43 * @var bool
|
Chris@12
|
44 */
|
Chris@12
|
45 protected $rebuilding = FALSE;
|
Chris@12
|
46
|
Chris@12
|
47 /**
|
Chris@0
|
48 * RouteProviderLazyBuilder constructor.
|
Chris@0
|
49 *
|
Chris@0
|
50 * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
|
Chris@0
|
51 * The route provider service.
|
Chris@0
|
52 * @param \Drupal\Core\Routing\RouteBuilderInterface $route_builder
|
Chris@0
|
53 * The route building service.
|
Chris@0
|
54 */
|
Chris@0
|
55 public function __construct(RouteProviderInterface $route_provider, RouteBuilderInterface $route_builder) {
|
Chris@0
|
56 $this->routeProvider = $route_provider;
|
Chris@0
|
57 $this->routeBuilder = $route_builder;
|
Chris@0
|
58 }
|
Chris@0
|
59
|
Chris@0
|
60 /**
|
Chris@0
|
61 * Gets the real route provider service and rebuilds the router id necessary.
|
Chris@0
|
62 *
|
Chris@0
|
63 * @return \Drupal\Core\Routing\RouteProviderInterface
|
Chris@0
|
64 * The route provider service.
|
Chris@0
|
65 */
|
Chris@0
|
66 protected function getRouteProvider() {
|
Chris@12
|
67 if (!$this->rebuilt && !$this->rebuilding) {
|
Chris@0
|
68 $this->routeBuilder->rebuild();
|
Chris@0
|
69 $this->rebuilt = TRUE;
|
Chris@0
|
70 }
|
Chris@0
|
71 return $this->routeProvider;
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 /**
|
Chris@0
|
75 * {@inheritdoc}
|
Chris@0
|
76 */
|
Chris@0
|
77 public function getRouteCollectionForRequest(Request $request) {
|
Chris@0
|
78 return $this->getRouteProvider()->getRouteCollectionForRequest($request);
|
Chris@0
|
79 }
|
Chris@0
|
80
|
Chris@0
|
81 /**
|
Chris@0
|
82 * {@inheritdoc}
|
Chris@0
|
83 */
|
Chris@0
|
84 public function getRouteByName($name) {
|
Chris@0
|
85 return $this->getRouteProvider()->getRouteByName($name);
|
Chris@0
|
86 }
|
Chris@0
|
87
|
Chris@0
|
88 /**
|
Chris@0
|
89 * {@inheritdoc}
|
Chris@0
|
90 */
|
Chris@0
|
91 public function preLoadRoutes($names) {
|
Chris@0
|
92 return $this->getRouteProvider()->preLoadRoutes($names);
|
Chris@0
|
93 }
|
Chris@0
|
94
|
Chris@0
|
95 /**
|
Chris@0
|
96 * {@inheritdoc}
|
Chris@0
|
97 */
|
Chris@0
|
98 public function getRoutesByNames($names) {
|
Chris@0
|
99 return $this->getRouteProvider()->getRoutesByNames($names);
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * {@inheritdoc}
|
Chris@0
|
104 */
|
Chris@0
|
105 public function getRoutesByPattern($pattern) {
|
Chris@0
|
106 return $this->getRouteProvider()->getRoutesByPattern($pattern);
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 /**
|
Chris@0
|
110 * {@inheritdoc}
|
Chris@0
|
111 */
|
Chris@0
|
112 public function getAllRoutes() {
|
Chris@0
|
113 return $this->getRouteProvider()->getAllRoutes();
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 /**
|
Chris@0
|
117 * {@inheritdoc}
|
Chris@0
|
118 */
|
Chris@0
|
119 public function reset() {
|
Chris@0
|
120 // Don't call getRouteProvider as this is results in recursive rebuilds.
|
Chris@0
|
121 return $this->routeProvider->reset();
|
Chris@0
|
122 }
|
Chris@0
|
123
|
Chris@0
|
124 /**
|
Chris@0
|
125 * {@inheritdoc}
|
Chris@0
|
126 */
|
Chris@0
|
127 public function getRoutesPaged($offset, $length = NULL) {
|
Chris@0
|
128 return $this->getRouteProvider()->getRoutesPaged($offset, $length);
|
Chris@0
|
129 }
|
Chris@0
|
130
|
Chris@0
|
131 /**
|
Chris@0
|
132 * {@inheritdoc}
|
Chris@0
|
133 */
|
Chris@0
|
134 public function getRoutesCount() {
|
Chris@0
|
135 return $this->getRouteProvider()->getRoutesCount();
|
Chris@0
|
136 }
|
Chris@0
|
137
|
Chris@0
|
138 /**
|
Chris@0
|
139 * Determines if the router has been rebuilt.
|
Chris@0
|
140 *
|
Chris@0
|
141 * @return bool
|
Chris@0
|
142 * TRUE is the router has been rebuilt, FALSE if not.
|
Chris@0
|
143 */
|
Chris@0
|
144 public function hasRebuilt() {
|
Chris@0
|
145 return $this->rebuilt;
|
Chris@0
|
146 }
|
Chris@0
|
147
|
Chris@12
|
148 /**
|
Chris@12
|
149 * {@inheritdoc}
|
Chris@12
|
150 */
|
Chris@12
|
151 public static function getSubscribedEvents() {
|
Chris@12
|
152 $events[RoutingEvents::DYNAMIC][] = ['routerRebuilding', 3000];
|
Chris@12
|
153 $events[RoutingEvents::FINISHED][] = ['routerRebuildFinished', -3000];
|
Chris@12
|
154 return $events;
|
Chris@12
|
155 }
|
Chris@12
|
156
|
Chris@12
|
157 /**
|
Chris@12
|
158 * Sets the router rebuilding flag to TRUE.
|
Chris@12
|
159 */
|
Chris@12
|
160 public function routerRebuilding() {
|
Chris@12
|
161 $this->rebuilding = TRUE;
|
Chris@12
|
162 }
|
Chris@12
|
163
|
Chris@12
|
164 /**
|
Chris@12
|
165 * Sets the router rebuilding flag to FALSE.
|
Chris@12
|
166 */
|
Chris@12
|
167 public function routerRebuildFinished() {
|
Chris@12
|
168 $this->rebuilding = FALSE;
|
Chris@12
|
169 }
|
Chris@12
|
170
|
Chris@0
|
171 }
|