X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Flib%2FDrupal%2FCore%2FRouting%2FRouteProvider.php;fp=web%2Fcore%2Flib%2FDrupal%2FCore%2FRouting%2FRouteProvider.php;h=95cbd6715b71534102c72a3d2a72b08c7b0a7d54;hp=6c20b1e47419c075e294446af2aacda08f242629;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/lib/Drupal/Core/Routing/RouteProvider.php b/web/core/lib/Drupal/Core/Routing/RouteProvider.php index 6c20b1e47..95cbd6715 100644 --- a/web/core/lib/Drupal/Core/Routing/RouteProvider.php +++ b/web/core/lib/Drupal/Core/Routing/RouteProvider.php @@ -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(); + } + }