it-swarm.com.de

Weiterleiten an eine externe URL beim Senden des Formulars

Ich habe eine FormBase erweitert und die submitForm -Methode definiert. Bei dieser Methode möchte ich zu einer externen URL umleiten ( https://example.com/my/path?amount=33&gift=0&product_id=1 )

$myurl = "https://example.com/my/path?amount=33&gift=0&product_id=1";
$redirect = Url::fromUri($myurl);
$form_state->setRedirectUrl($redirect);

Und ich bekomme den Fehler:

Redirects to external URLs are not allowed by default, use \Drupal\Core\Routing\TrustedRedirectResponse for it.

Ok, kein Problem, lass uns eins erstellen:

$myurl = "https://example.com/my/path?amount=33&gift=0&product_id=1";
$redirect = new TrustedRedirectResponse($myurl);
$form_state->setRedirectUrl($redirect);

Hier ist der Fehler:

Argument 1 passed to Drupal\Core\Form\FormState::setRedirectUrl() must be an instance of Drupal\Core\Url

Es scheint also, dass wir den Kreis geschlossen haben. Gibt es eine Möglichkeit, das TrustedRedirectResponse in ein Url Objekt zu konvertieren?

6
njp

Sie möchten stattdessen $form_state->setResponse() verwenden, um das von Ihnen erstellte TrustedRedirectResponse zu verwenden.

So etwas sollte funktionieren:

public function submitForm(array &$form, FormStateInterface $form_state) {
  // Do form stuff...

  $myurl = "https://example.com/my/path?amount=33&gift=0&product_id=1";
  $response = new TrustedRedirectResponse(Url::fromUri($myurl)->toString());
  $form_state->setResponse($response);
}

Diese Antwort kann abhängig von Ihren Seiten-Cache-Einstellungen zwischengespeichert werden. Wenn Sie dieses Verhalten ändern müssen, können Sie die Caching-Metadaten ändern. Dies sollte diese Art der Zwischenspeicherung für die Antwort vollständig deaktivieren (nicht getestet):

public function submitForm(array &$form, FormStateInterface $form_state) {
  // Do form stuff...

  $myurl = "https://example.com/my/path?amount=33&gift=0&product_id=1";
  $response = new TrustedRedirectResponse(Url::fromUri($myurl)->toString());

  $metadata = $response->getCacheableMetadata();
  $metadata->setCacheMaxAge(0);

  $form_state->setResponse($response);
}
6
hampercm