Answers:
您需要更改登录表单并添加一个提交处理程序,它将负责重定向。您不能$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 7上进行操作的方式没有什么不同,除了需要为Drupal 8修改代码外。
特别是:
hook_user_login()
不用于在用户登录后重定向用户,仅仅是因为在该挂钩中重定向用户会阻止其他hook_user_login()
实现被调用。重定向用户的正确方法是在登录表单中添加一个表单提交处理程序,该处理程序使用类似于以下代码的代码。
$form_state->setRedirect('user.page');
请注意,user.page是您希望用户重定向到的Drupal路径的路由名称。
如果您有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;
}
您也可以使用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()可能会覆盖大多数人的用例,并且可能是“正确”的答案,但是,将目标查询参数与hook_user_login一起使用意味着登录用户的任何表单提交 *都会重定向,但是不会干扰或事先不了解表格/要求的任何其他部分。
也就是说,它仍然可以与自定义登录表单一起使用,并且使用destination不会停止任何其他挂接(由\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/8/api/routing-system/routing-system-overview和api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/...
您还可以更改用户登录表单并添加自己的自定义提交处理程序以设置$ form_state redirect,而不是使用hook_user_login将用户直接重定向到您的自定义URL 。
<?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 ['redirect'],因为$ form_state现在是类对象。签出FormState :: setRedirect()以获得更多详细信息。
在D8中,您可以为此使用用户默认页面模块。
此模块允许您自定义用户登录或注销后重定向到的目标。您可以按角色或单个用户进行自定义。
有一个简单的模块可以做到这一点,它与Drupal 8兼容。它被称为User Default Page。
该模块允许您自定义登录或注销后用户重定向到的目标。您可以按角色或单个用户进行自定义。并为此操作自定义可配置的drupal消息。
hook_user_login()
不适用于重定向,如果您要在用户登录时对用户执行某些操作,则使用它。Fx core建议用户设置本地时区(如果未设置)。
相反,您需要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”路线更改为您需要的任何目的地。
问候
雷纳
只需destination
在登录网址中添加参数即可。
例: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 /登录到/ user / login?destination ='CUSTOM_NODE_PATH'
专门解决此问题的另一个选项是一个简单的Drupal 8贡献模块:登录后重定向。该模块可以在这里找到:
https://www.drupal.org/project/redirect_after_login
如描述所示,它是Drupal安全咨询策略所涵盖的简单,集中的模块。
``我正在研究一种方法,以解决依赖于hook_user_login的其他问题,因为在较新版本的8中其他许多选项都被打破了。其他一些重定向模块做了很多无关紧要的工作,或者/或完全浪费资源。我将以下简单逻辑组合到用于处理登录过程的自定义模块中:
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登录请求,可以正确地重定向以创建新帐户,然后在常规站点登录时重定向到其他页面。
$form_state->setRedirect('mymodule.dashboard);