Respostas:
Você precisa alterar o formulário de login e adicionar um manipulador de envio que cuidará do redirecionamento. Você não pode usar $form_state->setRedirectUrl()
diretamente no formato alter, pois será substituído por 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
aqui? Mantendo um redirecionamento existente?
O redirecionamento de usuários após o login em um site do Drupal 8 não é diferente de como foi feito no Drupal 7, exceto que o código precisa ser adaptado para o Drupal 8.
Em particular:
hook_user_login()
não é usado para redirecionar usuários após o logon, simplesmente pelo fato de que o redirecionamento de usuários nesse gancho impediria que outras hook_user_login()
implementações fossem invocadas.A maneira correta de redirecionar os usuários é adicionar um manipulador de envio de formulário ao formulário de logon que usa código semelhante ao seguinte.
$form_state->setRedirect('user.page');
Observe que user.page é o nome do roteamento do caminho do Drupal para o qual você deseja que o usuário seja redirecionado.
Se você tiver uma instância da Drupal\Core\Url
classe, também poderá usar o código a seguir.
$form_state->setRedirectUrl($url);
Lembre-se de que o primeiro método é preferível quando você está redirecionando usuários para uma página no mesmo site em que efetuaram login; o segundo método é normalmente usado para redirecionar usuários usando um URL externo.
você pode usar hook_user_login e tentar redirecionar parayourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Além disso, você pode usar o módulo Rules , mas ainda não existe uma versão estável para o Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
erros em determinadas circunstâncias com o descrito acima - sugiro substituir return;
por exit;
, para garantir que o redirecionamento - que define os cabeçalhos - seja a última coisa a ser executada.
Um pouco atrasado para a parte, mas conforme https://www.drupal.org/node/2068293#comment-11712455, você pode definir o destino em hook_user_login () para redirecionar ao final do processamento do login.
ie
/**
* 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()
);
}
}
}
Usar FormState :: setRedirect () de acordo com as outras respostas provavelmente abrangerá os casos de uso da maioria das pessoas e é potencialmente a resposta 'certa', no entanto, o uso do parâmetro de consulta de destino com hook_user_login significa que qualquer formulário enviado * que faça logon no usuário será redirecionado, mas sem interferência ou conhecimento prévio de qualquer outra parte do formulário / solicitação.
ou seja, ele ainda funcionará com um formulário de login personalizado e o uso do destino não interrompe outros ganchos (é implementado \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
no final do processamento da resposta).
* Qualquer envio de formulário que chame hook_user_login (user_login_finalize ()) e não chame manualmente FormState :: setResponse () .
mymodule.dashboard
é o nome da rota e pode ser substituído por qualquer nome de rota ( \Drupal\Core\Url::fromRoute('<front>')->toString()
ou seja, ou \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Para mais informações consulte drupal.org/docs/8/api/routing-system/routing-system-overview e api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/...
Você pode simplesmente fazer isso usando Regras
Reagir: depois que o usuário estiver conectado
Você também pode alterar o formulário de login do usuário e adicionar seu próprio manipulador de envio personalizado para definir o redirecionamento $ form_state, em vez de redirecionar o usuário diretamente para o URL personalizado usando 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');
}
Adicioná-lo no redirecionamento $ form_state garantirá que os outros manipuladores de envio / ganchos de login sejam chamados.
Como o Drupal7, não podemos definir $ form_state ['redirect'] diretamente, porque $ form_state agora é objeto de classe. Checkout FormState :: setRedirect () para obter mais detalhes.
No D8, você pode usar o módulo de página padrão do usuário para essa finalidade.
Este módulo permite que você personalize o destino ao qual um usuário é redirecionado após efetuar login ou logout. Você pode personalizar por funções ou usuários individuais.
Existe um módulo simples para fazer isso, compatível com o Drupal 8. É chamado de página padrão do usuário .
O módulo permite que você personalize o destino para o qual um usuário é redirecionado após efetuar login ou logout. Você pode personalizar por funções ou usuários individuais. E personalize mensagens drupal configuráveis para essas ações.
hook_user_login()
não funciona para o redirecionamento, é usado se você quiser fazer algo com o usuário quando ele efetuar login. O Fx core sugere que os usuários definam o fuso horário local, se não estiver definido.
Em vez disso, você precisa usar hook_form_alter
em todos os formulários de login e adicionar um manipulador de envio personalizado que defina o redirecionamento no objeto de estado do formulário.
Estou exibindo o formulário de login no meu próprio controlador. Dessa forma, é possível manipular o formulário (e, assim, redirecionar o usuário após o login) sem os ganchos não 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;
Mude a rota 'proreos.home' para o destino que você precisar.
Saudações
Rainer
Basta adicionar um destination
parâmetro ao URL de login.
Exemplo:http://example.com/user/login?destination=/my-page
Se você estiver fazendo isso para páginas 403 (Acesso negado), use o seguinte módulo:
https://www.drupal.org/project/redirect_403_to_login_page
Eu uso bastante o seguinte snippet, então pensei em compartilhá-lo. Você pode adicionar redirecionamentos diferentes, dependendo da função do usuário.
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();
}
}
Use qualquer um destes módulos:
https://www.drupal.org/project/login_redirect
OU
https://www.drupal.org/project/login_destination
Felicidades
Você pode usar o módulo logintoboggan para redirecionar. Possui outras configurações que podem ser úteis se você quiser outras funções, como o login usando nomes de usuário.
https://www.drupal.org/project/redirect
Portanto, configure o módulo acima para redirecionar de
/ user / login para / user / login? destination = 'CUSTOM_NODE_PATH'
Outra opção específica para esse problema é um simples módulo contribuído pelo Drupal 8: Redirecionar após o login . O módulo pode ser encontrado aqui:
https://www.drupal.org/project/redirect_after_login
Como mostra a descrição, é um módulo simples e focado, coberto pela política de consultoria de segurança do 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;
}
$form_state->setRedirect('mymodule.dashboard);