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}

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        $messages = $this->messages();
63
64        foreach ($messages as $key => $message) {
64        foreach ($messages as $key => $message) {
64        foreach ($messages as $key => $message) {
65            if ($queue === null || $message['queue'] === $queue) {
65            if ($queue === null || $message['queue'] === $queue) {
65            if ($queue === null || $message['queue'] === $queue) {
64        foreach ($messages as $key => $message) {
65            if ($queue === null || $message['queue'] === $queue) {
66                unset($messages[$key]);
64        foreach ($messages as $key => $message) {
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    }
Flash->has
73    public function has(?string $queue = null): bool
74    {
75        $messages = $this->messages();
76
77        if ($queue === null) {
78            return count($messages) > 0;
81        foreach ($messages as $message) {
81        foreach ($messages as $message) {
82            if ($message['queue'] === $queue) {
83                return true;
81        foreach ($messages as $message) {
81        foreach ($messages as $message) {
82            if ($message['queue'] === $queue) {
83                return true;
84            }
85        }
86
87        return false;
88    }
Flash->messages
94        $messages = $this->session->get($this->key, []);
95
96        if (!is_array($messages)) {
97            return [];
100        $flashes = [];
101
102        foreach ($messages as $key => $message) {
102        foreach ($messages as $key => $message) {
102        foreach ($messages as $key => $message) {
103            if (!is_array($message)) {
104                continue;
108            $body = $message['message'] ?? null;
109            /** @psalm-suppress MixedAssignment */
110            $queue = $message['queue'] ?? null;
111
112            if (is_string($body) && is_string($queue)) {
112            if (is_string($body) && is_string($queue)) {
112            if (is_string($body) && is_string($queue)) {
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,
102        foreach ($messages as $key => $message) {
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    }
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    }