回答:
ログインフォームを変更し、リダイレクトを処理する送信ハンドラを追加する必要があります。$form_state->setRedirectUrl()
フォームalterで直接使用することはできませんUserForm::submitForm()
。なぜなら、それはによって上書きされるからです。
/**
* 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'));
}
}
else
ここで何が起きているのか分かりませんか?既存のリダイレクトを維持しますか?
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;
}
また、Rulesモジュールを使用できますが、まだDrupal 8の安定バージョンはありません。
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
上記の特定の状況でエラーが発生していました-に置き換えreturn;
てexit;
、ヘッダーを設定するリダイレクトが最後に実行されるようにすることをお勧めします。
パーティーに少し遅れましたが、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()を使用すると、ほとんどの人のユースケースをカバーし、「正しい」回答になる可能性がありますが、フック_user_loginで宛先クエリパラメータを使用すると、ユーザーにログインするフォーム送信 *がリダイレクトされますが、フォーム/リクエストの他の部分の干渉または事前の知識なし。
つまり、カスタムログインフォームで引き続き機能し、宛先を使用しても他のフックは停止しません(\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
応答処理の最後に実装さ れます)。
* hook_user_login(user_login_finalize())を呼び出し、FormState :: setResponse()を手動で呼び出さないフォーム送信。
mymodule.dashboard
はルート名であり、任意のルート名(つまり\Drupal\Core\Url::fromRoute('<front>')->toString()
または\Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
)に置き換えることができます 。詳細については、drupal.org / docs
また、ユーザーのログインフォームを変更し、代わりに直接使用したカスタムURLにユーザーをリダイレクトする、独自のカスタムは$ form_stateリダイレクトを設定するには、ハンドラ提出する追加することができhook_user_loginを。
<?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()をチェックアウトしてください。
D8では、この目的でユーザーのデフォルトページモジュールを使用できます。
このモジュールを使用すると、ログインまたはログアウト後にユーザーがリダイレクトされる宛先をカスタマイズできます。ロールまたは個々のユーザーでカスタマイズできます。
Drupal 8と互換性のある、これを行う簡単なモジュールがあります。これはUser Default Pageと呼ばれます。
このモジュールを使用すると、ログインまたはログアウト後にユーザーがリダイレクトされる宛先をカスタマイズできます。ロールまたは個々のユーザーでカスタマイズできます。また、このアクションの構成可能なdrupalメッセージをカスタマイズします。
hook_user_login()
ユーザーのログイン時に何かをしたい場合に使用されます。Fxコアは、設定されていない場合はローカルタイムゾーンを設定することをユーザーに提案します。
代わりにhook_form_alter
、すべてのログインフォームで使用し、フォーム状態オブジェクトにリダイレクトを設定するカスタム送信ハンドラーを追加する必要があります。
私は自分のコントローラーでログインフォームを表示しています。そうすれば、非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」ルートを必要な宛先に変更します。
よろしく
Rainer
destination
ログインURLにパラメーターを追加するだけです。
例:http://example.com/user/login?destination=/my-page
403(アクセスが拒否されました)ページに対してそれを行う場合、次のモジュールを使用します:https :
//www.drupal.org/project/redirect_403_to_login_page
私は次のスニペットをかなり頻繁に使用するので、共有したいと思いました。ユーザーが持っている役割に応じて、異なるリダイレクトを追加できます。
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();
}
}
次のモジュールのいずれかを使用します。
https://www.drupal.org/project/login_redirect
または
https://www.drupal.org/project/login_destination
乾杯
リダイレクトにはlogintobogganモジュールを使用できます。ユーザー名を使用したログインなどの他の機能が必要な場合に便利な他の構成があります。
https://www.drupal.org/project/redirect
したがって、上記のモジュールを構成して、
/ user / login to / user / login?destination = 'CUSTOM_NODE_PATH'
この問題に特化した別のオプションは、単純なDrupal 8提供のモジュール:Redirect After Loginです。モジュールは次の場所にあります。
https://www.drupal.org/project/redirect_after_login
説明が示すように、これはDrupalセキュリティアドバイザリポリシーでカバーされるシンプルで焦点の合ったモジュールです。
$form_state->setRedirect('mymodule.dashboard);