it-swarm.com.de

So erzwingen Sie eine Umleitung (überschreiben Sie die Zielabfragezeichenfolge in der URL)

Ich habe ein benutzerdefiniertes Formular, um einen Rückruf zu senden und Benutzer auf eine bestimmte Seite umzuleiten:

function MYMODULE_authfrontpageredirect_callback(array &$form, FormStateInterface &$form_state) {
  $url = \Drupal::service('path.validator')->getUrlIfValid('node/16');
  $form_state->setRedirect($url->getRouteName(), $url->getRouteParameters());
}

Dies funktioniert ordnungsgemäß, es sei denn, die URL verfügt über eine Abfragezeichenfolge destination, z. B. /node/add/mynode?destination=/user

In diesem Fall wird der Benutzer basierend auf der Abfragezeichenfolge umgeleitet (zu /user) anstelle meines Submit-Handler-Ziels (node/16).

Wie kann ich den Inhalt der Abfragezeichenfolge destination für diesen Submit-Handler zwangsweise überschreiben?

Diese Frage ähnelt dieser D7-Frage , aber da Drupal 8 das Symfony-Routing-System hat, haben mir die Antworten dort nicht geholfen.

2
Patrick Kenny

Um eine Umleitung zu erzwingen, entfernen Sie die Zielabfragezeichenfolge aus der Anforderung:

\Drupal::request()->query->remove('destination');

Danach können Sie auch den RedirectDestination-Dienst zurücksetzen, obwohl dies für ein Formular nicht erforderlich zu sein scheint:

\Drupal::destination()->set(NULL);

Wenn Sie bereits ein URL-Objekt haben, setzen Sie es direkt in $ form_state:

$form_state->setRedirectUrl($url);
5
4k4

Haben Sie versucht, die RedirectResponse-Klasse zu verwenden? Ich habe diese Art von Rückrufen und es entfernt URL-Parameter.

use Symfony\Component\HttpFoundation\RedirectResponse;

function MYMODULE_authfrontpageredirect_callback(array &$form, FormStateInterface &$form_state) {
  $response = new RedirectResponse(\Drupal::url('entity.node.canonical', ['node' => '16']));
  $response->send();
}
0
Corentin Le Fur