Version 1
[yaffs-website] / web / core / lib / Drupal / Core / RouteProcessor / RouteProcessorCurrent.php
diff --git a/web/core/lib/Drupal/Core/RouteProcessor/RouteProcessorCurrent.php b/web/core/lib/Drupal/Core/RouteProcessor/RouteProcessorCurrent.php
new file mode 100644 (file)
index 0000000..e1555fb
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\Core\RouteProcessor;
+
+use Drupal\Core\Render\BubbleableMetadata;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Provides a route processor to replace <current>.
+ */
+class RouteProcessorCurrent implements OutboundRouteProcessorInterface {
+
+  /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * Constructs a new RouteProcessorCurrent.
+   *
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
+   */
+  public function __construct(RouteMatchInterface $route_match) {
+    $this->routeMatch = $route_match;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processOutbound($route_name, Route $route, array &$parameters, BubbleableMetadata $bubbleable_metadata = NULL) {
+    if ($route_name === '<current>') {
+      if ($current_route = $this->routeMatch->getRouteObject()) {
+        $requirements = $current_route->getRequirements();
+        // Setting _method and _schema is deprecated since 2.7. Using
+        // setMethods() and setSchemes() are now the recommended ways.
+        unset($requirements['_method']);
+        unset($requirements['_schema']);
+        $route->setRequirements($requirements);
+
+        $route->setPath($current_route->getPath());
+        $route->setSchemes($current_route->getSchemes());
+        $route->setMethods($current_route->getMethods());
+        $route->setOptions($current_route->getOptions());
+        $route->setDefaults($current_route->getDefaults());
+        $parameters = array_merge($parameters, $this->routeMatch->getRawParameters()->all());
+        if ($bubbleable_metadata) {
+          $bubbleable_metadata->addCacheContexts(['route']);
+        }
+      }
+      else {
+        // If we have no current route match available, point to the frontpage.
+        $route->setPath('/');
+      }
+    }
+  }
+
+}