web-dev-qa-db-ja.com

$ user-> save()でユーザーアカウントを保存した後にリダイレクトするにはどうすればよいですか?

$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();
}
3
Ștefan Roman
$form_state->setRedirectUrl(Url::fromUserInput($redirect_path));
3
PHP

リダイレクトするときにサイトに留まりたいと思います。 route.ymlファイル以外の場所にURLをハードコーディングすることはお勧めしません。適切なサービスを呼び出し、サービスで依存性注入を使用することを忘れないでください。また、トレイトを使用したり、コンテナから直接呼び出したりしないでください。

  private function redirect(string $route) {
    $path = $this->container->get('url_generator')->getPathFromRoute($route);
    return new RedirectResponse($path);
  }
2
ssibal

$user->save();の後に追加

  $url = Url::fromRoute('route.name');
  $response = new RedirectResponse($url->toString());
  // $response = '/some/path';
  $response = new \Symfony\Component\HttpFoundation\RedirectResponse($response);
  $response->send();
1
No Sssweat

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() を使用する必要があります。

0
kiamlaluno