แทนที่จะใช้ Drupal 7 hook คุณสามารถใช้เหตุการณ์ AccountEvents::SET_USER ใหม่:
/src/EventSubscriber/SetAccountSubscriber.php
<?php
เนมสเปซ Drupal\mymodule\EventSubscriber;
ใช้ Drupal\Core\Session\AccountEvents
ใช้ Drupal\Core\Session\AccountSetEvent;
ใช้ Drupal\Core\Session\UserSession;
ใช้ Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* ผู้สมัครสมาชิกกิจกรรม mymodule
*/
คลาส SetAccountSubscriber ใช้ EventSubscriberInterface {
/**
* ตัวจัดการเหตุการณ์ชุดบัญชี
*
* @param Drupal\Core\Session\AccountSetEvent $เหตุการณ์
* เหตุการณ์ชุดบัญชี
*/
ฟังก์ชั่นสาธารณะ onAccountSet (AccountSetEvent เหตุการณ์ $) {
$account = $event->getAccount();
ถ้า ($account->isAuthenticated()) {
$roles = $account->getRoles();
ถ้า (in_array ('ผู้ดูแลระบบ' $ บทบาท)) {
$บทบาท = array_values(array_diff($บทบาท, ['ผู้ดูแลระบบ']));
$account = เซสชันผู้ใช้ใหม่([
'uid' => $account->id(),
'การเข้าถึง' => $account->getLastAccessedTime(),
'บทบาท' => $บทบาท,
'ชื่อ' => $account->getAccountName(),
'preferred_langcode' => $account->getPreferredLangcode(),
'preferred_admin_langcode' => $account->getPreferredAdminLangcode(),
'mail' => $account->getEmail(),
'เขตเวลา' => $account->getTimeZone(),
]);
\Drupal::currentUser()->setAccount($บัญชี);
}
}
}
/**
* {@inheritdoc}
*/
ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
กลับ [
เหตุการณ์บัญชี::SET_USER => ['onAccountSet'],
];
}
}
mymodule.services.yml
บริการ:
mymodule.set_account_subscriber:
คลาส: Drupal\mymodule\EventSubscriber\SetAccountSubscriber
แท็ก:
- { ชื่อ: event_subscriber }
ระมัดระวังเพื่อหลีกเลี่ยงการวนซ้ำไม่สิ้นสุด บรรทัดสุดท้ายส่งเหตุการณ์อีกครั้ง และคุณต้องมีเงื่อนไขที่ป้องกันไม่ให้ดำเนินการรายการเป็นครั้งที่สอง ในกรณีนี้ผ่านบทบาทที่ถูกลบ