Skip to content

Commit 5f4fe6c

Browse files
committed
Add a flash messages service provider
Used to persist messages from the current request to the next request. Signed-off-by: Maurício Meneghini Fauth <[email protected]>
1 parent 2291814 commit 5f4fe6c

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpMyAdmin;
6+
7+
use RuntimeException;
8+
9+
final class FlashMessages
10+
{
11+
private const STORAGE_KEY = 'flashMessages';
12+
13+
/** @var array */
14+
private $storage;
15+
16+
/** @var array<string, string[]> */
17+
private $previousMessages = [];
18+
19+
public function __construct()
20+
{
21+
if (! isset($_SESSION)) {
22+
throw new RuntimeException(__('Session not found.'));
23+
}
24+
25+
$this->storage = &$_SESSION;
26+
27+
if (isset($this->storage[self::STORAGE_KEY])) {
28+
$this->previousMessages = $this->storage[self::STORAGE_KEY];
29+
}
30+
31+
$this->storage[self::STORAGE_KEY] = [];
32+
}
33+
34+
public function addMessage(string $key, string $message): void
35+
{
36+
if (! isset($this->storage[self::STORAGE_KEY][$key])) {
37+
$this->storage[self::STORAGE_KEY][$key] = [];
38+
}
39+
40+
$this->storage[self::STORAGE_KEY][$key][] = $message;
41+
}
42+
43+
/** @return string[]|null */
44+
public function getMessage(string $key): ?array
45+
{
46+
return $this->previousMessages[$key] ?? null;
47+
}
48+
49+
/** @return array<string, string[]> */
50+
public function getMessages(): array
51+
{
52+
return $this->previousMessages;
53+
}
54+
}

test/classes/FlashMessagesTest.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpMyAdmin\Tests;
6+
7+
use PhpMyAdmin\FlashMessages;
8+
use RuntimeException;
9+
10+
class FlashMessagesTest extends AbstractTestCase
11+
{
12+
private const STORAGE_KEY = 'flashMessages';
13+
14+
public function testConstructor(): void
15+
{
16+
$this->assertArrayNotHasKey(self::STORAGE_KEY, $_SESSION);
17+
$flash = new FlashMessages();
18+
$this->assertIsArray($_SESSION[self::STORAGE_KEY]);
19+
20+
$_SESSION = null;
21+
$this->expectException(RuntimeException::class);
22+
$this->expectExceptionMessage('Session not found.');
23+
$flash = new FlashMessages();
24+
}
25+
26+
public function testAddMessage(): void
27+
{
28+
$flash = new FlashMessages();
29+
$this->assertArrayNotHasKey('error', $_SESSION[self::STORAGE_KEY]);
30+
$flash->addMessage('error', 'Error');
31+
$this->assertArrayHasKey('error', $_SESSION[self::STORAGE_KEY]);
32+
$this->assertIsArray($_SESSION[self::STORAGE_KEY]['error']);
33+
$this->assertEquals(['Error'], $_SESSION[self::STORAGE_KEY]['error']);
34+
}
35+
36+
public function testGetMessage(): void
37+
{
38+
$_SESSION[self::STORAGE_KEY] = ['warning' => ['Warning']];
39+
$flash = new FlashMessages();
40+
$message = $flash->getMessage('error');
41+
$this->assertNull($message);
42+
$message = $flash->getMessage('warning');
43+
$this->assertEquals(['Warning'], $message);
44+
}
45+
46+
public function testGetMessages(): void
47+
{
48+
$_SESSION[self::STORAGE_KEY] = [
49+
'error' => ['Error1', 'Error2'],
50+
'warning' => ['Warning'],
51+
];
52+
$flash = new FlashMessages();
53+
$flash->addMessage('notice', 'Notice');
54+
$messages = $flash->getMessages();
55+
$this->assertEquals(
56+
[
57+
'error' => ['Error1', 'Error2'],
58+
'warning' => ['Warning'],
59+
],
60+
$messages
61+
);
62+
}
63+
}

0 commit comments

Comments
 (0)