phpmyadmin/src/FlashMessenger.php
Maurício Meneghini Fauth 9c576fcc9c
Refactor Twig extensions to use Twig's AttributeExtension
This allows to remove most extensions.

Signed-off-by: Maurício Meneghini Fauth <mauricio@mfauth.net>
2025-07-08 13:23:34 -03:00

67 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin;
use RuntimeException;
use Twig\Attribute\AsTwigFunction;
use function __;
/** @psalm-type FlashMessageList = list<array{context: string, message: string, statement: string}> */
final class FlashMessenger
{
private const STORAGE_KEY = 'FlashMessenger';
/** @var mixed[] */
private array|null $storage = null;
/** @psalm-var FlashMessageList */
private array $previousMessages = [];
/** @psalm-assert !null $this->storage */
private function initSessionStorage(): void
{
if ($this->storage !== null) {
return;
}
if (! isset($_SESSION)) {
throw new RuntimeException(__('Session not found.'));
}
$this->storage = &$_SESSION;
if (isset($this->storage[self::STORAGE_KEY])) {
$this->previousMessages = $this->storage[self::STORAGE_KEY];
}
$this->storage[self::STORAGE_KEY] = [];
}
public function addMessage(string $context, string $message, string $statement = ''): void
{
$this->initSessionStorage();
$this->storage[self::STORAGE_KEY][] = ['context' => $context, 'message' => $message, 'statement' => $statement];
}
/** @psalm-return FlashMessageList */
#[AsTwigFunction('flash_messages')]
public function getMessages(): array
{
$this->initSessionStorage();
return $this->previousMessages;
}
/** @psalm-return FlashMessageList */
public function getCurrentMessages(): array
{
$this->initSessionStorage();
return $this->storage[self::STORAGE_KEY];
}
}