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}

Branches

Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

Flash->__construct
14        private readonly Session $session,
15        private readonly string $key = self::STORAGE,
16    ) {}
Flash->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    }
Flash->clear
60    public function clear(?string $queue = null): void
61    {
62        if ($queue === null) {
63            $this->session->set($this->key, []);
64
65            return;
68        $messages = $this->messages();
69
70        foreach ($messages as $key => $message) {
70        foreach ($messages as $key => $message) {
70        foreach ($messages as $key => $message) {
71            if ($message['queue'] === $queue) {
70        foreach ($messages as $key => $message) {
71            if ($message['queue'] === $queue) {
72                unset($messages[$key]);
70        foreach ($messages as $key => $message) {
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    }
Flash->has
79    public function has(?string $queue = null): bool
80    {
81        $messages = $this->messages();
82
83        if ($queue === null) {
84            return count($messages) > 0;
87        foreach ($messages as $message) {
87        foreach ($messages as $message) {
88            if ($message['queue'] === $queue) {
89                return true;
87        foreach ($messages as $message) {
87        foreach ($messages as $message) {
88            if ($message['queue'] === $queue) {
89                return true;
90            }
91        }
92
93        return false;
94    }
Flash->messages
100        $messages = $this->session->get($this->key, []);
101
102        if (!is_array($messages)) {
103            return [];
106        $flashes = [];
107
108        foreach ($messages as $key => $message) {
108        foreach ($messages as $key => $message) {
108        foreach ($messages as $key => $message) {
109            if (!is_array($message)) {
110                continue;
114            $body = $message['message'] ?? null;
115            /** @psalm-suppress MixedAssignment */
116            $queue = $message['queue'] ?? null;
117
118            if (is_string($body) && is_string($queue)) {
118            if (is_string($body) && is_string($queue)) {
118            if (is_string($body) && is_string($queue)) {
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,
108        foreach ($messages as $key => $message) {
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    }
Flash->peek
32    public function peek(?string $queue = null): array
33    {
34        $messages = $this->messages();
35
36        if ($queue === null) {
37            return $messages;
40        $flashes = [];
41
42        foreach ($messages as $message) {
42        foreach ($messages as $message) {
43            if ($message['queue'] === $queue) {
42        foreach ($messages as $message) {
43            if ($message['queue'] === $queue) {
44                $flashes[] = $message;
42        foreach ($messages as $message) {
42        foreach ($messages as $message) {
43            if ($message['queue'] === $queue) {
44                $flashes[] = $message;
45            }
46        }
47
48        return $flashes;
49    }
Flash->pop
52    public function pop(?string $queue = null): array
53    {
54        $flashes = $this->peek($queue);
55        $this->clear($queue);
56
57        return $flashes;
58    }