Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
45 / 45
100.00% covered (success)
100.00%
39 / 39
44.44% covered (danger)
44.44%
12 / 27
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
1 / 1
Flash
100.00% covered (success)
100.00%
45 / 45
100.00% covered (success)
100.00%
39 / 39
44.44% covered (danger)
44.44%
12 / 27
100.00% covered (success)
100.00%
7 / 7
96.62
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%
5 / 5
100.00% covered (success)
100.00%
8 / 8
33.33% covered (danger)
33.33%
2 / 6
100.00% covered (success)
100.00%
1 / 1
8.74
 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 Celema\Session;
6
7/** @api */
8class Flash
9{
10    public const string STORAGE = 'celema_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        $messages = $this->messages();
63
64        foreach ($messages as $key => $message) {
65            if ($queue === null || $message['queue'] === $queue) {
66                unset($messages[$key]);
67            }
68        }
69
70        $this->session->set($this->key, $messages);
71    }
72
73    public function has(?string $queue = null): bool
74    {
75        $messages = $this->messages();
76
77        if ($queue === null) {
78            return count($messages) > 0;
79        }
80
81        foreach ($messages as $message) {
82            if ($message['queue'] === $queue) {
83                return true;
84            }
85        }
86
87        return false;
88    }
89
90    /** @return array<array-key, array{message: string, queue: string}> */
91    private function messages(): array
92    {
93        /** @psalm-suppress MixedAssignment */
94        $messages = $this->session->get($this->key, []);
95
96        if (!is_array($messages)) {
97            return [];
98        }
99
100        $flashes = [];
101
102        foreach ($messages as $key => $message) {
103            if (!is_array($message)) {
104                continue;
105            }
106
107            /** @psalm-suppress MixedAssignment */
108            $body = $message['message'] ?? null;
109            /** @psalm-suppress MixedAssignment */
110            $queue = $message['queue'] ?? null;
111
112            if (is_string($body) && is_string($queue)) {
113                $flashes[$key] = [
114                    'message' => $body,
115                    'queue' => $queue,
116                ];
117            }
118        }
119
120        return $flashes;
121    }
122}