web-dev-qa-db-ja.com

リダイレクトを強制する方法(URLの宛先クエリ文字列を上書きする)

ユーザーを特定のページにリダイレクトするカスタムフォーム送信コールバックがあります。

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

これは、URLがdestinationクエリ文字列(/node/add/mynode?destination=/userなど)を持たない限り、正しく機能します

この場合、ユーザーは、送信ハンドラの宛先(/user)ではなく、クエリ文字列に基づいて(node/16に)リダイレクトされます。

この送信ハンドラのdestinationクエリ文字列コンテンツを強制的にオーバーライドするにはどうすればよいですか?

この質問はこれに似ています D7質問 ですが、Drupal 8はSymfonyルーティングシステムを持っているため、そこでの回答は役に立ちませんでした。

2
Patrick Kenny

リダイレクトを強制するには、リクエストから宛先クエリ文字列を削除します。

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

この後、RedirectDestinationサービスをリセットすることもできますが、これはフォームに必要ではないようです。

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

URLオブジェクトが既にある場合は、$ form_stateに直接設定します。

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

RedirectResponse Class を使用してみましたか?この種のコールバックがあり、URLパラメータが削除されます。

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