Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / lib / Drupal / Core / Routing / RouteProvider.php
index 6c20b1e47419c075e294446af2aacda08f242629..95cbd6715b71534102c72a3d2a72b08c7b0a7d54 100644 (file)
@@ -6,6 +6,8 @@ use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Path\CurrentPathStack;
 use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
 use Drupal\Core\State\StateInterface;
@@ -85,6 +87,13 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv
    */
   protected $pathProcessor;
 
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
   /**
    * Cache ID prefix used to load routes.
    */
@@ -107,8 +116,10 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv
    *   The cache tag invalidator.
    * @param string $table
    *   (Optional) The table in the database to use for matching. Defaults to 'router'
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   (Optional) The language manager.
    */
-  public function __construct(Connection $connection, StateInterface $state, CurrentPathStack $current_path, CacheBackendInterface $cache_backend, InboundPathProcessorInterface $path_processor, CacheTagsInvalidatorInterface $cache_tag_invalidator, $table = 'router') {
+  public function __construct(Connection $connection, StateInterface $state, CurrentPathStack $current_path, CacheBackendInterface $cache_backend, InboundPathProcessorInterface $path_processor, CacheTagsInvalidatorInterface $cache_tag_invalidator, $table = 'router', LanguageManagerInterface $language_manager = NULL) {
     $this->connection = $connection;
     $this->state = $state;
     $this->currentPath = $current_path;
@@ -116,6 +127,7 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv
     $this->cacheTagInvalidator = $cache_tag_invalidator;
     $this->pathProcessor = $path_processor;
     $this->tableName = $table;
+    $this->languageManager = $language_manager ?: \Drupal::languageManager();
   }
 
   /**
@@ -147,7 +159,7 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv
   public function getRouteCollectionForRequest(Request $request) {
     // Cache both the system path as well as route parameters and matching
     // routes.
-    $cid = 'route:' . $request->getPathInfo() . ':' . $request->getQueryString();
+    $cid = $this->getRouteCollectionCacheId($request);
     if ($cached = $this->cache->get($cid)) {
       $this->currentPath->setPath($cached->data['path'], $request);
       $request->query->replace($cached->data['query']);
@@ -431,4 +443,35 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv
     return $this->connection->query("SELECT COUNT(*) FROM {" . $this->connection->escapeTable($this->tableName) . "}")->fetchField();
   }
 
+  /**
+   * Returns the cache ID for the route collection cache.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The request object.
+   *
+   * @return string
+   *   The cache ID.
+   */
+  protected function getRouteCollectionCacheId(Request $request) {
+    // Include the current language code in the cache identifier as
+    // the language information can be elsewhere than in the path, for example
+    // based on the domain.
+    $language_part = $this->getCurrentLanguageCacheIdPart();
+    return 'route:' . $language_part . ':' . $request->getPathInfo() . ':' . $request->getQueryString();
+  }
+
+  /**
+   * Returns the language identifier for the route collection cache.
+   *
+   * @return string
+   *   The language identifier.
+   */
+  protected function getCurrentLanguageCacheIdPart() {
+    // This must be in sync with the language logic in
+    // \Drupal\Core\PathProcessor\PathProcessorAlias::processInbound() and
+    // \Drupal\Core\Path\AliasManager::getPathByAlias().
+    // @todo Update this if necessary in https://www.drupal.org/node/1125428.
+    return $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_URL)->getId();
+  }
+
 }