$user->save()
でユーザーアカウントを保存した後、カスタムモジュールでユーザーをリダイレクトするにはどうすればよいですか?保存後は常にユーザープロファイルに移動し、カスタムページにリダイレクトしたいと思います。
function user_update_redirect(&$form, $form_state) {
$value1 = $form_state->getValue('panel');
$value2 = $form_state->getValue('type_of_user');
$storage = \Drupal::service('entity_type.manager')->getStorage('taxonomy_term');
$user = \Drupal::currentUser();
$user = user_load($user->id());
$user->set('field_panel', $value1);
$user->set('field_type_of_user', $value2);
kint($user);
$user->save();
}
$form_state->setRedirectUrl(Url::fromUserInput($redirect_path));
リダイレクトするときにサイトに留まりたいと思います。 route.ymlファイル以外の場所にURLをハードコーディングすることはお勧めしません。適切なサービスを呼び出し、サービスで依存性注入を使用することを忘れないでください。また、トレイトを使用したり、コンテナから直接呼び出したりしないでください。
private function redirect(string $route) {
$path = $this->container->get('url_generator')->getPathFromRoute($route);
return new RedirectResponse($path);
}
$user->save();
の後に追加
$url = Url::fromRoute('route.name'); $response = new RedirectResponse($url->toString()); // $response = '/some/path'; $response = new \Symfony\Component\HttpFoundation\RedirectResponse($response); $response->send();
FormState
オブジェクトを取得するuser_update_redirect()
では、次のいずれかのメソッドを呼び出すことができます。
FormState::setRedirect()
は、ノード、ユーザーアカウント、その他のエンティティの場合など、リダイレクトURLがルートに関連付けられている場合に適しています。その他の場合(外部URLへのリダイレクトなど)では、FormState::setRedirectUrl()
が使用するメソッドです。
フォーム送信ハンドラーで RedirectResponse
オブジェクトを返しても効果はありません。 ( _FormSubmitter::executeSubmitHandlers
_ )フォーム送信ハンドラを呼び出すメソッドは、それらから返された値を破棄します。
_ $handlers = $form_state->getSubmitHandlers();
// Otherwise, check for a form-level handler.
if (!$handlers && !empty($form['#submit'])) {
$handlers = $form['#submit'];
}
foreach ($handlers as $callback) {
// Check if a previous _submit handler has set a batch, but make sure we
// do not react to a batch that is already being processed (for instance
// if a batch operation performs a
// \Drupal\Core\Form\FormBuilderInterface::submitForm()).
if (($batch =& $this->batchGet()) && !isset($batch['id'])) {
// Some previous submit handler has set a batch. To ensure correct
// execution order, store the call in a special 'control' batch set.
// See _batch_next_set().
$batch['sets'][] = [
'form_submit' => $callback,
];
$batch['has_form_submits'] = TRUE;
}
else {
call_user_func_array($form_state->prepareCallback($callback), [
&$form,
&$form_state,
]);
}
}
_
From送信ハンドラからRedirectResponse::send()
を呼び出すと、他のフォーム送信ハンドラや他のフックの呼び出しなど、フォームの処理時にDrupalが実行している処理が中断されます。
FormState::setRedirectUrl()
を使用する必要がある場合、Url
オブジェクトは Url::fromUserInput()
から構築する必要があります(相対URIが指定されている場合のみ)ユーザー入力(たとえば、ユーザーがリダイレクトパスを指定するための設定フォームに入力したとき)。フォーム送信ハンドラーを実装するモジュールでよく知られている外部URLの場合、 Url::fromUri()
を使用する必要があります。