ログイン後にユーザーをリダイレクトしたいのですが、hook_user_login()
を使用してリダイレクトできますか?リダイレクトのパラメーターを追加するにはどうすればよいですか?
ログインフォームを変更し、リダイレクトを処理する送信ハンドラを追加する必要があります。 $form_state->setRedirectUrl()
によって上書きされるため、UserForm::submitForm()
をalter形式で直接使用することはできません。
/**
* Implements hook_form_FORM_ID_alter().
*/
function mymodule_form_user_login_form_alter(&$form, FormStateInterface $form_state) {
$form['#submit'][] = 'mymodule_user_login_submit';
}
/**
* Form submission handler for user_login_form().
*
* Redirects the user to the dashboard after logging in.
*/
function mymodule_user_login_submit(&$form, FormStateInterface $form_state) {
$url = Url::fromRoute('mymodule.dashboard');
// Check if a destination was set, probably on an exception controller.
// @see \Drupal\user\Form\UserLoginForm::submitForm()
$request = \Drupal::service('request_stack')->getCurrentRequest();
if (!$request->request->has('destination')) {
$form_state->setRedirectUrl($url);
}
else {
$request->query->set('destination', $request->request->get('destination'));
}
}
Drupal 8サイトにログインした後のユーザーのリダイレクトは、コードをDrupal 8に適合させる必要があることを除いて、Drupal 7での方法と同じです。 。
特に:
hook_user_login()
は、ログイン後にユーザーをリダイレクトするためには使用されません。単に、そのフックでユーザーをリダイレクトすると、他のhook_user_login()
実装が呼び出されなくなるためです。ユーザーをリダイレクトする正しい方法は、次のようなコードを使用するログインフォームにフォーム送信ハンドラーを追加することです。
$form_state->setRedirect('user.page');
user.pageは、ユーザーをリダイレクトするDrupalパスのルーティング名であることに注意してください。Drupal\Core\Url
クラスのインスタンスがある場合は、次のコードも使用できます。
$form_state->setRedirectUrl($url);
ログインしたサイトと同じサイトのページにユーザーをリダイレクトする場合は、最初の方法をお勧めします。 2番目の方法は、通常、外部URLを使用してユーザーをリダイレクトするために使用されます。
hook_user_login を使用してyourpath
にリダイレクトしてみることができます
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
ルールモジュール も使用できますが、Drupal 8の安定版はまだありません。
パーティーに少し遅れますが https://www.drupal.org/node/2068293#comment-11712455 に従って、ログイン処理の最後にリダイレクトするようにhook_user_login()で宛先を設定できます。
つまり.
/**
* Implements hook_user_login().
*/
function mymodule_user_login(\Drupal\user\UserInterface $account) {
// Ignore password reset.
$route_name = \Drupal::routeMatch()->getRouteName();
if ($route_name !== 'user.reset.login') {
// Do not interfere if a destination was already set.
$current_request = \Drupal::service('request_stack')->getCurrentRequest();
if (!$current_request->query->get('destination')) {
// Default login destination to the dashboard.
$current_request->query->set(
'destination',
\Drupal\Core\Url::fromRoute('mymodule.dashboard')->toString()
);
}
}
}
他の回答と同様にFormState :: setRedirect()を使用すると、おそらくほとんどの人のユースケースがカバーされ、潜在的に「正しい」回答になります。ただし、hook_user_loginで宛先クエリパラメータを使用すると、any form submit*ユーザーのログインはリダイレクトされますが、フォーム/リクエストの他の部分に関する干渉や事前の知識はありません。
つまり、カスタムログインフォームでも機能し、宛先を使用しても他のフックは停止しません(最後に\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
によって実装されます)応答処理の)。
* hook_user_login(user_login_finalize())を呼び出し、FormState :: setResponse()を手動で呼び出さないフォーム送信。
D8では、この目的で ユーザーのデフォルトページ モジュールを使用できます。
このモジュールを使用すると、ログインまたはログアウト後にユーザーがリダイレクトされる宛先をカスタマイズできます。役割または個々のユーザーごとにカスタマイズできます。
hook_user_login を使用してユーザーを直接カスタムURLにリダイレクトする代わりに、ユーザーログインフォームを変更して独自のカスタム送信ハンドラを追加し、$ form_stateリダイレクトを設定することもできます。
<?php
/**
* Implements hook_form_alter().
*/
function [MODULENAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface\FormStateInterface $form_state, $form_id) {
switch ($form_id) {
// Alter login form and add own custom submit handler.
case 'user_login_form':
$form['#submit'][] = '_[MODULENAME]_user_login_form_submit';
break;
}
}
/**
* Custom submit handler for login form.
*/
function _[MODULENAME]_user_login_form_submit($form, FormStateInterface $form_state) {
// Set redirect to login form.
$form_state->setRedirect('YOUR.MENU-ROUTER.NAME');
}
$ form_stateリダイレクトに追加すると、他の送信ハンドラ/ログインフックが確実に呼び出されます。
Drupal7と同様に、$ form_stateがクラスオブジェクトになっているため、$ form_state ['redirect']を直接設定することはできません。詳細については、チェックアウト FormState :: setRedirect() を参照してください。
Drupal 8.と互換性のある、これを行う簡単なモジュールがあります。これは ser Default Page と呼ばれます。
このモジュールを使用すると、ログインまたはログアウト後にユーザーがリダイレクトされる宛先をカスタマイズできます。役割または個々のユーザーごとにカスタマイズできます。そして、このアクションの設定可能なdrupalメッセージをカスタマイズします。
hook_user_login()
はリダイレクトでは機能しません。ユーザーがログインしたときに何かを実行したい場合に使用されます。Fxコアは、ローカルタイムゾーンが設定されていない場合は設定するようユーザーに提案します。
代わりに、すべてのログインフォームでhook_form_alter
を使用し、フォーム状態オブジェクトにリダイレクトを設定するカスタム送信ハンドラを追加する必要があります。
ログインURLにdestination
パラメータを追加するだけです。
例:http://example.com/user/login?destination=/my-page
403(アクセス拒否)ページでそれを行う場合は、次のモジュールを使用します。
https://www.drupal.org/project/redirect_403_to_login_page
自分のコントローラにログインフォームを表示しています。そうすれば、非OOフックなしでフォームを操作することができます(したがって、ログイン後にユーザーをリダイレクトできます)。
$fb = $this->formBuilder();
$rc['top'] = ['#markup' => '<p>Willkommen im Kundenbereich von proreos.
Bitte melden Sie sich hier mit Ihrem
Benutzernamen oder Ihrer Email Addresse an.</p>'];
$form = $fb->getForm("Drupal\user\Form\UserLoginForm");
$ug = $this->getUrlGenerator();
$redir = $ug->generateFromRoute('proreos.home', [],
['query' => $this->getDestinationArray(), 'external' => FALSE]);
$form['#action'] = $redir;
$rc['login'] = $form;
return $rc;
'proreos.home'ルートを必要な目的地に変更します。
よろしく
ライナー
次のスニペットをよく使っているので、共有したいと思いました。ユーザーの役割に応じて、さまざまなリダイレクトを追加できます。
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Redirect on login.
*/
function MYMODULE_user_login($account) {
$roles = $account->getRoles();
if(in_array('webmaster', $roles)) {
$response = new RedirectResponse('/admin/content');
$response->send();
}
}
リダイレクトには logintoboggan モジュールを使用できます。ユーザー名を使用したログインなど、他の機能が必要な場合に役立つ他の構成があります。
https://www.drupal.org/project/redirect
したがって、リダイレクトするように上記のモジュールを構成します
/ user/login to/user/login?destination = 'CUSTOM_NODE_PATH'
この問題に特化した別のオプションは、単純なDrupal 8寄稿モジュール:リダイレクト後のリダイレクトです。モジュールは次の場所にありますここに:
https://www.drupal.org/project/redirect_after_login
説明に示されているように、これは、Drupalセキュリティアドバイザリポリシーでカバーされている、シンプルでフォーカスされたモジュールです。
/**
* hook_user_login Redirect to English language whenever admin login
**/
function modulename_user_login($account) {
// We want to redirect user on login.
$response = new Symfony\Component\HttpFoundation\RedirectResponse("/en/admin/config");
$response->send();
return;
}
他の多くのオプションが新しいバージョンの8で壊れているため、私はhook_user_loginに依存する他のものを回避する方法に取り組んでいました。他のいくつかのリダイレクトモジュールは多くの脚注を実行しますそれは、もはや関連性がないか、および/または単に正に独り占めのリソースのいずれかです。この単純なロジックを、ログインプロセスを処理するためのカスタムモジュールにまとめました。
function hook_user_login( UserInterface $account ) {
// Doing checks to see if the login is from an HTML Origin or not.
// Could be from RESTful request to logins
$request = \Drupal::request();
if ($request->getRequestFormat() !== 'html') {
// default
return;
}
// Get the destination to see where the login request is going.
// This is useful to check for interactions from user creations.
$destination = $request->query->get('destination');
// Check the destination. If the destination will result in a re-direct
// to your homepage (here statically defined, but could be programmatic)
// then you can force re-direct to a different page. This is the URL defined
// in config > system > basic site settings.
if ($destination && $destination === '/whatever-homepage-uri-is') {
// Regular login, send to alternate welcome page
$response = new RedirectResponse('/welcome');
$response->send();
exit;
}
// default
return;
}
私はこれをDrupal 8.8.3で正常に使用していて、自分のREST作成した別のモジュールからのログイン要求を壊さず、新しいものに正しくリダイレクトしますアカウントの作成後、通常のサイトログインで別のページにリダイレクトします。