로그인 한 후 사용자를 리디렉션하고 싶습니다. 리디렉션에 사용할 hook_user_login()
수 있습니까? 리디렉션에 대한 매개 변수를 어떻게 추가합니까?
답변
로그인 양식을 변경하고 리디렉션을 처리 할 제출 핸들러를 추가해야합니다. 에 $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'));
}
}
답변
Drupal 8 사이트에 로그인 한 후 사용자를 리디렉션하는 것은 Drupal 8에 맞게 코드를 수정해야한다는 점을 제외하고 Drupal 7에서 수행 한 방식과 다르지 않습니다.
특히:
hook_user_login()
는 로그인 후 사용자를 리디렉션하는 데 사용되지 않습니다. 단순히 해당 후크에서 사용자를 리디렉션하면 다른hook_user_login()
구현이 호출되지 않습니다.-
사용자를 리디렉션하는 올바른 방법은 다음과 유사한 코드를 사용하는 양식 제출 핸들러를 로그인 양식에 추가하는 것입니다.
$form_state->setRedirect('user.page');
통지 user.page은 당신이 사용자가 리디렉션 할 드루팔 경로에 대한 라우팅 이름입니다. 클래스
의 인스턴스가있는 경우Drupal\Core\Url
다음 코드를 사용할 수도 있습니다.$form_state->setRedirectUrl($url);
사용자를 로그인 한 동일한 사이트의 페이지로 사용자를 리디렉션 할 때 첫 번째 방법을 사용하는 것이 좋습니다. 두 번째 방법은 일반적으로 외부 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과 함께 대상 쿼리 매개 변수를 사용 하면 사용자가 로그인 한 양식 제출 *이 리디렉션되지만 양식 / 요청의 다른 부분에 대한 간섭이나 사전 지식없이
즉, 여전히 사용자 정의 로그인 양식으로 작동하며 대상을 사용하더라도 다른 후크가 중지되지 않습니다 ( \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
응답 처리가 끝날 때 구현 됨 ).
* 어떤 형태) (즉, 발동 hook_user_login (user_login_finalize ()) 제출 및 수동 FormState :: setResponse를 호출하지 않습니다 .
답변
답변
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 () 자세한 내용은.
답변
D8에서는 이 목적 으로 사용자 기본 페이지 모듈을 사용할 수 있습니다 .
이 모듈을 사용하면 로그인 또는 로그 아웃 한 후 사용자가 리디렉션되는 대상을 사용자 정의 할 수 있습니다. 역할 또는 개별 사용자별로 사용자 정의 할 수 있습니다.