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;
*/
protected $pathProcessor;
+ /**
+ * The language manager.
+ *
+ * @var \Drupal\Core\Language\LanguageManagerInterface
+ */
+ protected $languageManager;
+
/**
* Cache ID prefix used to load routes.
*/
* 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;
$this->cacheTagInvalidator = $cache_tag_invalidator;
$this->pathProcessor = $path_processor;
$this->tableName = $table;
+ $this->languageManager = $language_manager ?: \Drupal::languageManager();
}
/**
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']);
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();
+ }
+
}