public function RedirectRepository::findMatchingRedirect in Redirect 8
Gets a redirect for given path, query and language.
Parameters
string $source_path: The redirect source path.
array $query: The redirect source path query.
$language: The language for which is the redirect.
Return value
\Drupal\redirect\Entity\Redirect The matched redirect entity.
Throws
\Drupal\redirect\Exception\RedirectLoopException
1 call to RedirectRepository::findMatchingRedirect()
- RedirectRepository::findByRedirect in src/
RedirectRepository.php - Helper function to find recursive redirects.
File
- src/
RedirectRepository.php, line 65
Class
Namespace
Drupal\redirectCode
public function findMatchingRedirect($source_path, array $query = [], $language = Language::LANGCODE_NOT_SPECIFIED) {
$source_path = ltrim($source_path, '/');
$hashes = [
Redirect::generateHash($source_path, $query, $language),
];
if ($language != Language::LANGCODE_NOT_SPECIFIED) {
$hashes[] = Redirect::generateHash($source_path, $query, Language::LANGCODE_NOT_SPECIFIED);
}
// Add a hash without the query string if using passthrough querystrings.
if (!empty($query) && $this->config
->get('passthrough_querystring')) {
$hashes[] = Redirect::generateHash($source_path, [], $language);
if ($language != Language::LANGCODE_NOT_SPECIFIED) {
$hashes[] = Redirect::generateHash($source_path, [], Language::LANGCODE_NOT_SPECIFIED);
}
}
// Load redirects by hash. A direct query is used to improve performance.
$rid = $this->connection
->query('SELECT rid FROM {redirect} WHERE hash IN (:hashes[]) ORDER BY LENGTH(redirect_source__query) DESC', [
':hashes[]' => $hashes,
])
->fetchField();
if (!empty($rid)) {
// Check if this is a loop.
if (in_array($rid, $this->foundRedirects)) {
throw new RedirectLoopException('/' . $source_path, $rid);
}
$this->foundRedirects[] = $rid;
$redirect = $this
->load($rid);
// Find chained redirects.
if ($recursive = $this
->findByRedirect($redirect, $language)) {
// Reset found redirects.
$this->foundRedirects = [];
return $recursive;
}
return $redirect;
}
// Reset found redirects.
$this->foundRedirects = [];
return NULL;
}