În loc de un cârlig Drupal 7, puteți folosi noul eveniment AccountEvents::SET_USER:
/src/EventSubscriber/SetAccountSubscriber.php
<?php
spațiu de nume Drupal\mymodule\EventSubscriber;
utilizați Drupal\Core\Session\AccountEvents;
utilizați Drupal\Core\Session\AccountSetEvent;
utilizați Drupal\Core\Session\UserSession;
utilizați Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* abonat eveniment mymodule.
*/
clasa SetAccountSubscriber implementează EventSubscriberInterface {
/**
* Gestionar de evenimente set de cont.
*
* @param Drupal\Core\Session\AccountSetEvent $event
* Eveniment set de cont.
*/
funcția publică onAccountSet(AccountSetEvent $event) {
$cont = $eveniment->getAccount();
dacă ($account->isAuthenticated()) {
$roluri = $cont->getRoles();
if (in_array('administrator', $roluri)) {
$roluri = array_values(array_diff($roluri, ['administrator']));
$cont = sesiune utilizator noua([
'uid' => $account->id(),
'access' => $account->getLastAccessedTime(),
'roles' => $roluri,
'name' => $account->getAccountName(),
'preferred_langcode' => $account->getPreferredLangcode(),
'preferred_admin_langcode' => $account->getPreferredAdminLangcode(),
'mail' => $account->getEmail(),
'timezone' => $account->getTimeZone(),
]);
\Drupal::currentUser()->setAccount($cont);
}
}
}
/**
* {@inheritdoc}
*/
funcție publică statică getSubscribedEvents() {
întoarcere [
AccountEvents::SET_USER => ['onAccountSet'],
];
}
}
mymodule.services.yml
Servicii:
mymodule.set_account_subscriber:
clasa: Drupal\mymodule\EventSubscriber\SetAccountSubscriber
Etichete:
- { nume: event_subscriber }
Aveți grijă să evitați o buclă infinită. Ultima linie trimite din nou evenimentul și aveți nevoie de o condiție care să împiedice executarea liniei a doua oară, în acest caz prin rolul eliminat.