ฉันต้องการที่จะเปลี่ยนเส้นทางผู้ใช้หลังจากที่พวกเขาเข้าสู่ระบบมันเป็นไปได้ที่จะใช้hook_user_login()
ในการเปลี่ยนเส้นทาง? ฉันจะเพิ่มพารามิเตอร์สำหรับการเปลี่ยนเส้นทางได้อย่างไร
ฉันต้องการที่จะเปลี่ยนเส้นทางผู้ใช้หลังจากที่พวกเขาเข้าสู่ระบบมันเป็นไปได้ที่จะใช้hook_user_login()
ในการเปลี่ยนเส้นทาง? ฉันจะเพิ่มพารามิเตอร์สำหรับการเปลี่ยนเส้นทางได้อย่างไร
คำตอบ:
คุณต้องแก้ไขแบบฟอร์มการเข้าสู่ระบบและเพิ่มตัวจัดการการส่งซึ่งจะดูแลการเปลี่ยนเส้นทาง คุณไม่สามารถใช้โดยตรงในรูปแบบปรับเปลี่ยนเพราะมันจะถูกเขียนทับโดย$form_state->setRedirectUrl()
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;
}
นอกจากนี้คุณสามารถใช้โมดูลกฎแต่ยังไม่มีเวอร์ชั่นที่เสถียรสำหรับ 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 () ตามคำตอบอื่น ๆ อาจครอบคลุมกรณีการใช้งานของคนส่วนใหญ่และอาจเป็นคำตอบที่ 'ถูกต้อง' อย่างไรก็ตามการใช้ param แบบสอบถามปลายทางกับ hook_user_login หมายความว่าการส่งแบบฟอร์ม * ที่บันทึกในผู้ใช้จะเปลี่ยนเส้นทาง โดยไม่มีการรบกวนหรือความรู้ล่วงหน้าของส่วนอื่น ๆ ของแบบฟอร์ม / คำขอ
เช่นมันจะยังคงทำงานกับแบบฟอร์มการเข้าสู่ระบบที่กำหนดเองและการใช้ปลายทางไม่ได้หยุด hooks อื่น ๆ (มันถูกนำมาใช้โดย \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 แทนโดยตรงเปลี่ยนเส้นทางผู้ใช้ไปยัง URL ที่กำหนดเองของคุณโดยใช้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 ['redirect'] โดยตรงได้เนื่องจาก $ form_state เป็นวัตถุคลาส Checkout FormState :: setRedirect ()สำหรับรายละเอียดเพิ่มเติม
ใน D8 คุณสามารถใช้โมดูลหน้าเริ่มต้นของผู้ใช้เพื่อจุดประสงค์นี้
โมดูลนี้ช่วยให้คุณสามารถกำหนดปลายทางที่ผู้ใช้ถูกเปลี่ยนเส้นทางไปหลังจากเข้าสู่ระบบหรือออกจากระบบ คุณสามารถปรับแต่งตามบทบาทหรือผู้ใช้รายบุคคล
hook_user_login()
ไม่ทำงานสำหรับการเปลี่ยนเส้นทางจะใช้หากคุณต้องการทำอะไรกับผู้ใช้เมื่อเขาเข้าสู่ระบบ Fx core แนะนำให้ผู้ใช้ตั้งเขตเวลาท้องถิ่นหากไม่ได้ตั้งค่าไว้
แต่คุณต้องใช้hook_form_alter
ในทุกรูปแบบการเข้าสู่ระบบและเพิ่มตัวจัดการการส่งแบบกำหนดเองซึ่งตั้งค่าการเปลี่ยนเส้นทางบนวัตถุสถานะแบบฟอร์ม
ฉันกำลังแสดงแบบฟอร์มการเข้าสู่ระบบในตัวควบคุมของฉันเอง วิธีนี้เป็นไปได้ที่จะจัดการกับแบบฟอร์ม (และเปลี่ยนเส้นทางผู้ใช้หลังจากเข้าสู่ระบบ) โดยไม่มี hooks ไม่ใช่ 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
พารามิเตอร์ในการเข้าสู่ระบบ 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
ดังนั้นกำหนดค่าโมดูลข้างต้นเพื่อเปลี่ยนเส้นทางจาก
/ ผู้ใช้ / เข้าสู่ระบบ / ผู้ใช้ / เข้าสู่ระบบ? destination = 'CUSTOM_NODE_PATH'
ตัวเลือกเฉพาะสำหรับปัญหานี้ก็คือโมดูลง่าย Drupal 8 ส่วนร่วม: เปลี่ยนเส้นทางหลังจากที่เข้าสู่ระบบ โมดูลสามารถพบได้ที่นี่:
https://www.drupal.org/project/redirect_after_login
ดังที่คำอธิบายแสดงให้เห็นว่าเป็นโมดูลที่เรียบง่ายและมุ่งเน้นที่ครอบคลุมโดยนโยบายการให้คำปรึกษาด้านความปลอดภัยของ 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;
}
ฉันทำงานเพื่อหาทางแก้ไขสิ่งอื่น ๆ ที่ขึ้นอยู่กับhook_user_loginเพราะมีตัวเลือกอื่นมากมายที่ทำลายใน 8 เวอร์ชั่นที่ใหม่กว่าโมดูลอื่น ๆ ที่นำเสนอโดยตรงบางตัวทำงานขาแบบที่ไม่มีความเกี่ยวข้องอีกต่อไปและ / หรือเพียงแค่ทรัพยากร hogging นอก ฉันได้รวบรวมตรรกะง่ายๆนี้ไว้ในโมดูลที่กำหนดเองสำหรับจัดการกระบวนการล็อกอิน:
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);