comparison vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Symfony\Component\HttpFoundation\Session\Storage;
13
14 use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
15
16 /**
17 * MockArraySessionStorage mocks the session for unit tests.
18 *
19 * No PHP session is actually started since a session can be initialized
20 * and shutdown only once per PHP execution cycle.
21 *
22 * When doing functional testing, you should use MockFileSessionStorage instead.
23 *
24 * @author Fabien Potencier <fabien@symfony.com>
25 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
26 * @author Drak <drak@zikula.org>
27 */
28 class MockArraySessionStorage implements SessionStorageInterface
29 {
30 /**
31 * @var string
32 */
33 protected $id = '';
34
35 /**
36 * @var string
37 */
38 protected $name;
39
40 /**
41 * @var bool
42 */
43 protected $started = false;
44
45 /**
46 * @var bool
47 */
48 protected $closed = false;
49
50 /**
51 * @var array
52 */
53 protected $data = array();
54
55 /**
56 * @var MetadataBag
57 */
58 protected $metadataBag;
59
60 /**
61 * @var array|SessionBagInterface[]
62 */
63 protected $bags = array();
64
65 /**
66 * Constructor.
67 *
68 * @param string $name Session name
69 * @param MetadataBag $metaBag MetadataBag instance
70 */
71 public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null)
72 {
73 $this->name = $name;
74 $this->setMetadataBag($metaBag);
75 }
76
77 /**
78 * Sets the session data.
79 *
80 * @param array $array
81 */
82 public function setSessionData(array $array)
83 {
84 $this->data = $array;
85 }
86
87 /**
88 * {@inheritdoc}
89 */
90 public function start()
91 {
92 if ($this->started) {
93 return true;
94 }
95
96 if (empty($this->id)) {
97 $this->id = $this->generateId();
98 }
99
100 $this->loadSession();
101
102 return true;
103 }
104
105 /**
106 * {@inheritdoc}
107 */
108 public function regenerate($destroy = false, $lifetime = null)
109 {
110 if (!$this->started) {
111 $this->start();
112 }
113
114 $this->metadataBag->stampNew($lifetime);
115 $this->id = $this->generateId();
116
117 return true;
118 }
119
120 /**
121 * {@inheritdoc}
122 */
123 public function getId()
124 {
125 return $this->id;
126 }
127
128 /**
129 * {@inheritdoc}
130 */
131 public function setId($id)
132 {
133 if ($this->started) {
134 throw new \LogicException('Cannot set session ID after the session has started.');
135 }
136
137 $this->id = $id;
138 }
139
140 /**
141 * {@inheritdoc}
142 */
143 public function getName()
144 {
145 return $this->name;
146 }
147
148 /**
149 * {@inheritdoc}
150 */
151 public function setName($name)
152 {
153 $this->name = $name;
154 }
155
156 /**
157 * {@inheritdoc}
158 */
159 public function save()
160 {
161 if (!$this->started || $this->closed) {
162 throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
163 }
164 // nothing to do since we don't persist the session data
165 $this->closed = false;
166 $this->started = false;
167 }
168
169 /**
170 * {@inheritdoc}
171 */
172 public function clear()
173 {
174 // clear out the bags
175 foreach ($this->bags as $bag) {
176 $bag->clear();
177 }
178
179 // clear out the session
180 $this->data = array();
181
182 // reconnect the bags to the session
183 $this->loadSession();
184 }
185
186 /**
187 * {@inheritdoc}
188 */
189 public function registerBag(SessionBagInterface $bag)
190 {
191 $this->bags[$bag->getName()] = $bag;
192 }
193
194 /**
195 * {@inheritdoc}
196 */
197 public function getBag($name)
198 {
199 if (!isset($this->bags[$name])) {
200 throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
201 }
202
203 if (!$this->started) {
204 $this->start();
205 }
206
207 return $this->bags[$name];
208 }
209
210 /**
211 * {@inheritdoc}
212 */
213 public function isStarted()
214 {
215 return $this->started;
216 }
217
218 /**
219 * Sets the MetadataBag.
220 *
221 * @param MetadataBag $bag
222 */
223 public function setMetadataBag(MetadataBag $bag = null)
224 {
225 if (null === $bag) {
226 $bag = new MetadataBag();
227 }
228
229 $this->metadataBag = $bag;
230 }
231
232 /**
233 * Gets the MetadataBag.
234 *
235 * @return MetadataBag
236 */
237 public function getMetadataBag()
238 {
239 return $this->metadataBag;
240 }
241
242 /**
243 * Generates a session ID.
244 *
245 * This doesn't need to be particularly cryptographically secure since this is just
246 * a mock.
247 *
248 * @return string
249 */
250 protected function generateId()
251 {
252 return hash('sha256', uniqid('ss_mock_', true));
253 }
254
255 protected function loadSession()
256 {
257 $bags = array_merge($this->bags, array($this->metadataBag));
258
259 foreach ($bags as $bag) {
260 $key = $bag->getStorageKey();
261 $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : array();
262 $bag->initialize($this->data[$key]);
263 }
264
265 $this->started = true;
266 $this->closed = false;
267 }
268 }