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
だから私たちは完全に一周したようです。 TrustedRedirectResponse
をUrl
オブジェクトに変換できる方法はありますか?
代わりに$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);
}