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