Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
48 / 48
100.00% covered (success)
100.00%
39 / 39
46.15% covered (danger)
46.15%
12 / 26
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
1 / 1
Flash
100.00% covered (success)
100.00%
48 / 48
100.00% covered (success)
100.00%
39 / 39
46.15% covered (danger)
46.15%
12 / 26
100.00% covered (success)
100.00%
7 / 7
89.85
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 add
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 peek
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
8 / 8
40.00% covered (danger)
40.00%
2 / 5
100.00% covered (success)
100.00%
1 / 1
7.46
 pop
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 clear
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
8 / 8
40.00% covered (danger)
40.00%
2 / 5
100.00% covered (success)
100.00%
1 / 1
7.46
 has
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
8 / 8
40.00% covered (danger)
40.00%
2 / 5
100.00% covered (success)
100.00%
1 / 1
7.46
 messages
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
12 / 12
37.50% covered (danger)
37.50%
3 / 8
100.00% covered (success)
100.00%
1 / 1
14.79
1<?php
2
3declare(strict_types=1);
4
5namespace Celemas\Session;
6
7/** @api */
8class Flash
9{
10    public const string STORAGE = 'celemas_flash_messages';
11
12    /** @param non-empty-string $key */
13    public function __construct(
14        private readonly Session $session,
15        private readonly string $key = self::STORAGE,
16    ) {}
17
18    public function add(
19        string $message,
20        string $queue = 'default',
21    ): void {
22        $messages = $this->messages();
23        $messages[] = [
24            'message' => $message,
25            'queue' => $queue,
26        ];
27
28        $this->session->set($this->key, $messages);
29    }
30
31    /** @return array<array-key, array{message: string, queue: string}> */
32    public function peek(?string $queue = null): array
33    {
34        $messages = $this->messages();
35
36        if ($queue === null) {
37            return $messages;
38        }
39
40        $flashes = [];
41
42        foreach ($messages as $message) {
43            if ($message['queue'] === $queue) {
44                $flashes[] = $message;
45            }
46        }
47
48        return $flashes;
49    }
50
51    /** @return array<array-key, array{message: string, queue: string}> */
52    public function pop(?string $queue = null): array
53    {
54        $flashes = $this->peek($queue);
55        $this->clear($queue);
56
57        return $flashes;
58    }
59
60    public function clear(?string $queue = null): void
61    {
62        if ($queue === null) {
63            $this->session->set($this->key, []);
64
65            return;
66        }
67
68        $messages = $this->messages();
69
70        foreach ($messages as $key => $message) {
71            if ($message['queue'] === $queue) {
72                unset($messages[$key]);
73            }
74        }
75
76        $this->session->set($this->key, $messages);
77    }
78
79    public function has(?string $queue = null): bool
80    {
81        $messages = $this->messages();
82
83        if ($queue === null) {
84            return count($messages) > 0;
85        }
86
87        foreach ($messages as $message) {
88            if ($message['queue'] === $queue) {
89                return true;
90            }
91        }
92
93        return false;
94    }
95
96    /** @return array<array-key, array{message: string, queue: string}> */
97    private function messages(): array
98    {
99        /** @psalm-suppress MixedAssignment */
100        $messages = $this->session->get($this->key, []);
101
102        if (!is_array($messages)) {
103            return [];
104        }
105
106        $flashes = [];
107
108        foreach ($messages as $key => $message) {
109            if (!is_array($message)) {
110                continue;
111            }
112
113            /** @psalm-suppress MixedAssignment */
114            $body = $message['message'] ?? null;
115            /** @psalm-suppress MixedAssignment */
116            $queue = $message['queue'] ?? null;
117
118            if (is_string($body) && is_string($queue)) {
119                $flashes[$key] = [
120                    'message' => $body,
121                    'queue' => $queue,
122                ];
123            }
124        }
125
126        return $flashes;
127    }
128}