Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Session/AccountProxy.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | af1871eacc83 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Session/AccountProxy.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,199 @@ +<?php + +namespace Drupal\Core\Session; + +/** + * A proxied implementation of AccountInterface. + * + * The reason why we need an account proxy is that we don't want to have global + * state directly stored in the container. + * + * This proxy object avoids multiple invocations of the authentication manager + * which can happen if the current user is accessed in constructors. It also + * allows legacy code to change the current user where the user cannot be + * directly injected into dependent code. + */ +class AccountProxy implements AccountProxyInterface { + + /** + * The instantiated account. + * + * @var \Drupal\Core\Session\AccountInterface + */ + protected $account; + + /** + * Account id. + * + * @var int + */ + protected $id = 0; + + /** + * Initial account id. + * + * @var int + * + * @deprecated Scheduled for removal in Drupal 8.4.x. Use $this->id instead. + */ + protected $initialAccountId; + + /** + * {@inheritdoc} + */ + public function setAccount(AccountInterface $account) { + // If the passed account is already proxied, use the actual account instead + // to prevent loops. + if ($account instanceof static) { + $account = $account->getAccount(); + } + $this->account = $account; + $this->id = $account->id(); + date_default_timezone_set(drupal_get_user_timezone()); + } + + /** + * {@inheritdoc} + */ + public function getAccount() { + if (!isset($this->account)) { + if ($this->id) { + // After the container is rebuilt, DrupalKernel sets the initial + // account to the id of the logged in user. This is necessary in order + // to refresh the user account reference here. + $this->setAccount($this->loadUserEntity($this->id)); + } + else { + $this->account = new AnonymousUserSession(); + } + } + + return $this->account; + } + + /** + * {@inheritdoc} + */ + public function id() { + return $this->id; + } + + /** + * {@inheritdoc} + */ + public function getRoles($exclude_locked_roles = FALSE) { + return $this->getAccount()->getRoles($exclude_locked_roles); + } + + /** + * {@inheritdoc} + */ + public function hasPermission($permission) { + return $this->getAccount()->hasPermission($permission); + } + + /** + * {@inheritdoc} + */ + public function isAuthenticated() { + return $this->getAccount()->isAuthenticated(); + } + + /** + * {@inheritdoc} + */ + public function isAnonymous() { + return $this->getAccount()->isAnonymous(); + } + + /** + * {@inheritdoc} + */ + public function getPreferredLangcode($fallback_to_default = TRUE) { + return $this->getAccount()->getPreferredLangcode($fallback_to_default); + } + + /** + * {@inheritdoc} + */ + public function getPreferredAdminLangcode($fallback_to_default = TRUE) { + return $this->getAccount()->getPreferredAdminLangcode($fallback_to_default); + } + + /** + * {@inheritdoc} + */ + public function getUsername() { + return $this->getAccountName(); + } + + /** + * {@inheritdoc} + */ + public function getAccountName() { + return $this->getAccount()->getAccountName(); + } + + /** + * {@inheritdoc} + */ + public function getDisplayName() { + return $this->getAccount()->getDisplayName(); + } + + /** + * {@inheritdoc} + */ + public function getEmail() { + return $this->getAccount()->getEmail(); + } + + /** + * {@inheritdoc} + */ + public function getTimeZone() { + return $this->getAccount()->getTimeZone(); + } + + /** + * {@inheritdoc} + */ + public function getLastAccessedTime() { + return $this->getAccount()->getLastAccessedTime(); + } + + /** + * {@inheritdoc} + */ + public function setInitialAccountId($account_id) { + if (isset($this->account)) { + throw new \LogicException('AccountProxyInterface::setInitialAccountId() cannot be called after an account was set on the AccountProxy'); + } + + $this->id = $this->initialAccountId = $account_id; + } + + /** + * Load a user entity. + * + * The entity manager requires additional initialization code and cache + * clearing after the list of modules is changed. Therefore it is necessary to + * retrieve it as late as possible. + * + * Because of serialization issues it is currently not possible to inject the + * container into the AccountProxy. Thus it is necessary to retrieve the + * entity manager statically. + * + * @see https://www.drupal.org/node/2430447 + * + * @param int $account_id + * The id of an account to load. + * + * @return \Drupal\Core\Session\AccountInterface|null + * An account or NULL if none is found. + */ + protected function loadUserEntity($account_id) { + return \Drupal::entityManager()->getStorage('user')->load($account_id); + } + +}