사용자 로그인 후 리디렉션 리디렉션하고 싶습니다. 리디렉션에 사용할 hook_user_login()수

로그인 한 후 사용자를 리디렉션하고 싶습니다. 리디렉션에 사용할 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를 호출하지 않습니다 .


답변

당신은 단순히 규칙 을 사용하여 그것을 할 수 있습니다

반응 : 사용자가 로그인 한 후

  • 작업 추가 : 리디렉션 >> 다음 매개 변수를 사용하거나 URL을 입력하십시오.

답변

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에서는 이 목적 으로 사용자 기본 페이지 모듈을 사용할 수 있습니다 .

이 모듈을 사용하면 로그인 또는 로그 아웃 한 후 사용자가 리디렉션되는 대상을 사용자 정의 할 수 있습니다. 역할 또는 개별 사용자별로 사용자 정의 할 수 있습니다.