web-dev-qa-db-ja.com

フォーム送信時に外部URLにリダイレクトする方法

FormBaseを拡張し、submitFormメソッドを定義しました。この方法では、外部URLにリダイレクトしたい( 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);

そして私はエラーを受け取ります:

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

OK、問題ありません、作成しましょう:

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

ここにエラーがあります:

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

だから私たちは完全に一周したようです。 TrustedRedirectResponseUrlオブジェクトに変換できる方法はありますか?

6
njp

代わりに$form_state->setResponse()を使用して、作成しているTrustedRedirectResponseを利用することをお勧めします。

このようなものはうまくいくはずです:

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);
}

この応答は、ページのキャッシュ設定によってはキャッシュされる場合があります。この動作を変更する必要がある場合は、キャッシングメタデータを変更できます。これにより、応答に対してこのタイプのキャッシュが完全に無効になります(テストされていません)。

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