Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\Session;
|
Chris@0
|
4
|
Chris@0
|
5 /**
|
Chris@0
|
6 * A proxied implementation of AccountInterface.
|
Chris@0
|
7 *
|
Chris@0
|
8 * The reason why we need an account proxy is that we don't want to have global
|
Chris@0
|
9 * state directly stored in the container.
|
Chris@0
|
10 *
|
Chris@0
|
11 * This proxy object avoids multiple invocations of the authentication manager
|
Chris@0
|
12 * which can happen if the current user is accessed in constructors. It also
|
Chris@0
|
13 * allows legacy code to change the current user where the user cannot be
|
Chris@0
|
14 * directly injected into dependent code.
|
Chris@0
|
15 */
|
Chris@0
|
16 class AccountProxy implements AccountProxyInterface {
|
Chris@0
|
17
|
Chris@0
|
18 /**
|
Chris@0
|
19 * The instantiated account.
|
Chris@0
|
20 *
|
Chris@0
|
21 * @var \Drupal\Core\Session\AccountInterface
|
Chris@0
|
22 */
|
Chris@0
|
23 protected $account;
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * Account id.
|
Chris@0
|
27 *
|
Chris@0
|
28 * @var int
|
Chris@0
|
29 */
|
Chris@0
|
30 protected $id = 0;
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * Initial account id.
|
Chris@0
|
34 *
|
Chris@0
|
35 * @var int
|
Chris@0
|
36 *
|
Chris@0
|
37 * @deprecated Scheduled for removal in Drupal 8.4.x. Use $this->id instead.
|
Chris@0
|
38 */
|
Chris@0
|
39 protected $initialAccountId;
|
Chris@0
|
40
|
Chris@0
|
41 /**
|
Chris@0
|
42 * {@inheritdoc}
|
Chris@0
|
43 */
|
Chris@0
|
44 public function setAccount(AccountInterface $account) {
|
Chris@0
|
45 // If the passed account is already proxied, use the actual account instead
|
Chris@0
|
46 // to prevent loops.
|
Chris@0
|
47 if ($account instanceof static) {
|
Chris@0
|
48 $account = $account->getAccount();
|
Chris@0
|
49 }
|
Chris@0
|
50 $this->account = $account;
|
Chris@0
|
51 $this->id = $account->id();
|
Chris@0
|
52 date_default_timezone_set(drupal_get_user_timezone());
|
Chris@0
|
53 }
|
Chris@0
|
54
|
Chris@0
|
55 /**
|
Chris@0
|
56 * {@inheritdoc}
|
Chris@0
|
57 */
|
Chris@0
|
58 public function getAccount() {
|
Chris@0
|
59 if (!isset($this->account)) {
|
Chris@0
|
60 if ($this->id) {
|
Chris@0
|
61 // After the container is rebuilt, DrupalKernel sets the initial
|
Chris@0
|
62 // account to the id of the logged in user. This is necessary in order
|
Chris@0
|
63 // to refresh the user account reference here.
|
Chris@0
|
64 $this->setAccount($this->loadUserEntity($this->id));
|
Chris@0
|
65 }
|
Chris@0
|
66 else {
|
Chris@0
|
67 $this->account = new AnonymousUserSession();
|
Chris@0
|
68 }
|
Chris@0
|
69 }
|
Chris@0
|
70
|
Chris@0
|
71 return $this->account;
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 /**
|
Chris@0
|
75 * {@inheritdoc}
|
Chris@0
|
76 */
|
Chris@0
|
77 public function id() {
|
Chris@0
|
78 return $this->id;
|
Chris@0
|
79 }
|
Chris@0
|
80
|
Chris@0
|
81 /**
|
Chris@0
|
82 * {@inheritdoc}
|
Chris@0
|
83 */
|
Chris@0
|
84 public function getRoles($exclude_locked_roles = FALSE) {
|
Chris@0
|
85 return $this->getAccount()->getRoles($exclude_locked_roles);
|
Chris@0
|
86 }
|
Chris@0
|
87
|
Chris@0
|
88 /**
|
Chris@0
|
89 * {@inheritdoc}
|
Chris@0
|
90 */
|
Chris@0
|
91 public function hasPermission($permission) {
|
Chris@0
|
92 return $this->getAccount()->hasPermission($permission);
|
Chris@0
|
93 }
|
Chris@0
|
94
|
Chris@0
|
95 /**
|
Chris@0
|
96 * {@inheritdoc}
|
Chris@0
|
97 */
|
Chris@0
|
98 public function isAuthenticated() {
|
Chris@0
|
99 return $this->getAccount()->isAuthenticated();
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * {@inheritdoc}
|
Chris@0
|
104 */
|
Chris@0
|
105 public function isAnonymous() {
|
Chris@0
|
106 return $this->getAccount()->isAnonymous();
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 /**
|
Chris@0
|
110 * {@inheritdoc}
|
Chris@0
|
111 */
|
Chris@0
|
112 public function getPreferredLangcode($fallback_to_default = TRUE) {
|
Chris@0
|
113 return $this->getAccount()->getPreferredLangcode($fallback_to_default);
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 /**
|
Chris@0
|
117 * {@inheritdoc}
|
Chris@0
|
118 */
|
Chris@0
|
119 public function getPreferredAdminLangcode($fallback_to_default = TRUE) {
|
Chris@0
|
120 return $this->getAccount()->getPreferredAdminLangcode($fallback_to_default);
|
Chris@0
|
121 }
|
Chris@0
|
122
|
Chris@0
|
123 /**
|
Chris@0
|
124 * {@inheritdoc}
|
Chris@0
|
125 */
|
Chris@0
|
126 public function getUsername() {
|
Chris@0
|
127 return $this->getAccountName();
|
Chris@0
|
128 }
|
Chris@0
|
129
|
Chris@0
|
130 /**
|
Chris@0
|
131 * {@inheritdoc}
|
Chris@0
|
132 */
|
Chris@0
|
133 public function getAccountName() {
|
Chris@0
|
134 return $this->getAccount()->getAccountName();
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 /**
|
Chris@0
|
138 * {@inheritdoc}
|
Chris@0
|
139 */
|
Chris@0
|
140 public function getDisplayName() {
|
Chris@0
|
141 return $this->getAccount()->getDisplayName();
|
Chris@0
|
142 }
|
Chris@0
|
143
|
Chris@0
|
144 /**
|
Chris@0
|
145 * {@inheritdoc}
|
Chris@0
|
146 */
|
Chris@0
|
147 public function getEmail() {
|
Chris@0
|
148 return $this->getAccount()->getEmail();
|
Chris@0
|
149 }
|
Chris@0
|
150
|
Chris@0
|
151 /**
|
Chris@0
|
152 * {@inheritdoc}
|
Chris@0
|
153 */
|
Chris@0
|
154 public function getTimeZone() {
|
Chris@0
|
155 return $this->getAccount()->getTimeZone();
|
Chris@0
|
156 }
|
Chris@0
|
157
|
Chris@0
|
158 /**
|
Chris@0
|
159 * {@inheritdoc}
|
Chris@0
|
160 */
|
Chris@0
|
161 public function getLastAccessedTime() {
|
Chris@0
|
162 return $this->getAccount()->getLastAccessedTime();
|
Chris@0
|
163 }
|
Chris@0
|
164
|
Chris@0
|
165 /**
|
Chris@0
|
166 * {@inheritdoc}
|
Chris@0
|
167 */
|
Chris@0
|
168 public function setInitialAccountId($account_id) {
|
Chris@0
|
169 if (isset($this->account)) {
|
Chris@0
|
170 throw new \LogicException('AccountProxyInterface::setInitialAccountId() cannot be called after an account was set on the AccountProxy');
|
Chris@0
|
171 }
|
Chris@0
|
172
|
Chris@0
|
173 $this->id = $this->initialAccountId = $account_id;
|
Chris@0
|
174 }
|
Chris@0
|
175
|
Chris@0
|
176 /**
|
Chris@0
|
177 * Load a user entity.
|
Chris@0
|
178 *
|
Chris@0
|
179 * The entity manager requires additional initialization code and cache
|
Chris@0
|
180 * clearing after the list of modules is changed. Therefore it is necessary to
|
Chris@0
|
181 * retrieve it as late as possible.
|
Chris@0
|
182 *
|
Chris@0
|
183 * Because of serialization issues it is currently not possible to inject the
|
Chris@0
|
184 * container into the AccountProxy. Thus it is necessary to retrieve the
|
Chris@0
|
185 * entity manager statically.
|
Chris@0
|
186 *
|
Chris@0
|
187 * @see https://www.drupal.org/node/2430447
|
Chris@0
|
188 *
|
Chris@0
|
189 * @param int $account_id
|
Chris@0
|
190 * The id of an account to load.
|
Chris@0
|
191 *
|
Chris@0
|
192 * @return \Drupal\Core\Session\AccountInterface|null
|
Chris@0
|
193 * An account or NULL if none is found.
|
Chris@0
|
194 */
|
Chris@0
|
195 protected function loadUserEntity($account_id) {
|
Chris@0
|
196 return \Drupal::entityManager()->getStorage('user')->load($account_id);
|
Chris@0
|
197 }
|
Chris@0
|
198
|
Chris@0
|
199 }
|