/** * Implements Drupal\Core\PathProcessor\OutboundPathProcessorInterface::processOutbound(). */ public function processOutbound($path, &$options = array(), Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { // Rewrite user/uid to user/username. if (preg_match('!^/user/([0-9]+)(/.*)?!', $path, $matches)) { if ($account = User::load($matches[1])) { $matches += array(2 => ''); $path = '/user/' . $account->getUsername() . $matches[2]; if ($bubbleable_metadata) { $bubbleable_metadata->addCacheTags($account->getCacheTags()); } } } // Rewrite forum/ to community/. return preg_replace('@^/forum(.*)@', '/community$1', $path); }
/** * {@inheritdoc} */ public function processOutbound($path, &$options = array(), Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { if ($request) { // The following values are not supposed to change during a single page // request processing. if (!isset($this->queryRewrite)) { if ($this->currentUser->isAnonymous()) { $languages = $this->languageManager->getLanguages(); $config = $this->config->get('language.negotiation')->get('session'); $this->queryParam = $config['parameter']; $this->queryValue = $request->query->has($this->queryParam) ? $request->query->get($this->queryParam) : NULL; $this->queryRewrite = isset($languages[$this->queryValue]); } else { $this->queryRewrite = FALSE; } } // If the user is anonymous, the user language negotiation method is // enabled, and the corresponding option has been set, we must preserve // any explicit user language preference even with cookies disabled. if ($this->queryRewrite) { if (isset($options['query']) && is_string($options['query'])) { $query = array(); parse_str($options['query'], $query); $options['query'] = $query; } if (!isset($options['query'][$this->queryParam])) { $options['query'][$this->queryParam] = $this->queryValue; } if ($bubbleable_metadata) { // Cached URLs that have been processed by this outbound path // processor must be: $bubbleable_metadata->addCacheTags($this->config->get('language.negotiation')->getCacheTags())->addCacheContexts(['url.query_args:' . $this->queryParam]); } } } return $path; }