X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Flib%2FDrupal%2FCore%2FRouting%2FRouteProvider.php;h=d31f293e18c411c660c4c96989e0fef7625f66c9;hb=1c1cb0980bfa6caf0c24cce671b6bb541dc87583;hp=6c20b1e47419c075e294446af2aacda08f242629;hpb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;p=yaffs-website diff --git a/web/core/lib/Drupal/Core/Routing/RouteProvider.php b/web/core/lib/Drupal/Core/Routing/RouteProvider.php index 6c20b1e47..d31f293e1 100644 --- a/web/core/lib/Drupal/Core/Routing/RouteProvider.php +++ b/web/core/lib/Drupal/Core/Routing/RouteProvider.php @@ -2,10 +2,11 @@ namespace Drupal\Core\Routing; -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 +86,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 +115,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 +126,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 +158,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']); @@ -333,7 +344,7 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv // have a case-insensitive match from the incoming path to the lower case // pattern outlines from \Drupal\Core\Routing\RouteCompiler::compile(). // @see \Drupal\Core\Routing\CompiledRoute::__construct() - $parts = preg_split('@/+@', Unicode::strtolower($path), NULL, PREG_SPLIT_NO_EMPTY); + $parts = preg_split('@/+@', mb_strtolower($path), NULL, PREG_SPLIT_NO_EMPTY); $collection = new RouteCollection(); @@ -390,7 +401,7 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv * {@inheritdoc} */ public function reset() { - $this->routes = []; + $this->routes = []; $this->serializedRoutes = []; $this->cacheTagInvalidator->invalidateTags(['routes']); } @@ -431,4 +442,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(); + } + }