Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
18 / 18
CRAP
100.00% covered (success)
100.00%
1 / 1
NativeSession
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
18 / 18
20
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
1
 start
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 isStarted
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 get
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 set
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 all
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 has
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 delete
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 clear
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 replace
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 count
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 addFlashMessage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getFlash
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 regenerateId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 destroy
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
2
 getId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 save
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3// ╔════════════════════════════════════════════════════════════╗
4// ║ MIT Licence (#Expat) - https://opensource.org/licenses/MIT ║
5// ║ Copyright 2026 Frederic Poeydomenge <dyno@phexium.com>     ║
6// ╚════════════════════════════════════════════════════════════╝
7
8declare(strict_types=1);
9
10namespace Phexium\Plugin\Session\Adapter;
11
12use Override;
13use Phexium\Plugin\Session\Port\FlashInterface;
14use Phexium\Plugin\Session\Port\SessionInterface;
15
16final readonly class NativeSession implements SessionInterface
17{
18    public function __construct(private string $sessionName = 'PHPSESSID') {}
19
20    #[Override]
21    public function start(): void
22    {
23        if ($this->isStarted()) {
24            return;
25        }
26
27        session_name($this->sessionName);
28        session_start();
29    }
30
31    #[Override]
32    public function isStarted(): bool
33    {
34        return session_status() === PHP_SESSION_ACTIVE;
35    }
36
37    #[Override]
38    public function get(string $key, mixed $default = null): mixed
39    {
40        return $_SESSION[$key] ?? $default;
41    }
42
43    #[Override]
44    public function set(string $key, mixed $value): void
45    {
46        $_SESSION[$key] = $value;
47    }
48
49    #[Override]
50    public function all(): array
51    {
52        return $_SESSION;
53    }
54
55    #[Override]
56    public function has(string $key): bool
57    {
58        return isset($_SESSION[$key]);
59    }
60
61    #[Override]
62    public function delete(string $key): void
63    {
64        unset($_SESSION[$key]);
65    }
66
67    #[Override]
68    public function clear(): void
69    {
70        $_SESSION = [];
71    }
72
73    #[Override]
74    public function replace(array $data): void
75    {
76        $_SESSION = $data;
77    }
78
79    #[Override]
80    public function count(): int
81    {
82        return count($_SESSION);
83    }
84
85    #[Override]
86    public function addFlashMessage(string $level, string $message): void
87    {
88        $this->getFlash()->add($level, $message);
89    }
90
91    #[Override]
92    public function getFlash(): FlashInterface
93    {
94        return new NativeFlash($_SESSION);
95    }
96
97    #[Override]
98    public function regenerateId(): void
99    {
100        session_regenerate_id(true);
101    }
102
103    #[Override]
104    public function destroy(): void
105    {
106        $_SESSION = [];
107
108        if (ini_get('session.use_cookies') === '1') {
109            $params = session_get_cookie_params();
110            setcookie(
111                session_name(),
112                '',
113                ['expires' => time() - 42000, 'path' => $params['path'], 'domain' => $params['domain'], 'secure' => $params['secure'], 'httponly' => $params['httponly']]
114            );
115        }
116
117        session_destroy();
118        session_start();
119    }
120
121    #[Override]
122    public function getId(): string
123    {
124        return session_id();
125    }
126
127    #[Override]
128    public function getName(): string
129    {
130        return session_name();
131    }
132
133    #[Override]
134    public function save(): void
135    {
136        session_write_close();
137    }
138}