Supponiamo di avere un controller con un metodo che effettua un redirect ad un sito esterno:
class Controller extends ControllerBase {
public function redirectToWebsite() {
return new RedirectResponse('https://google.com')
}
}
Questo non funzionerà, dato che le RedirectResponse di Symfony in Drupal non funzionano se non si effettua il redirect a URL interni al proprio sito Drupal.
Drupal infatti ci suggerisce di utilizzare un TrustedRedirectResponse:
class Controller extends ControllerBase {
public function redirectToWebsite() {
return new TrustedRedirectResponse('https://google.com')
}
}
Ci sono però casi in cui neanche questo funziona. Perciò, è meglio usare le classiche Response di symfony:
class Controller extends ControllerBase {
public function redirectToWebsite() {
return $this->createExternalRedirectResponse('https://google.com')
}
/**
* Create a response that will redirect to an external URL.
*/
private function createExternalRedirectResponse(string $url): Response {
$response = new Response('', 302, []);
$response->setContent(sprintf('Redirecting to %1$s.', htmlspecialchars($url, ENT_QUOTES, 'UTF-8')));
$response->headers->set('Location', $url);
return $response;
}
}