Passed
Push — main ( 069f28...09b711 )
by Sammy
12:14 queued 05:15
created

Smith::has()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
3
namespace HexMakina\StateAgent;
4
5
use HexMakina\BlackBox\StateAgentInterface;
6
7
class Smith implements StateAgentInterface
8
{
9
10
    private static ?StateAgentInterface $instance = null;
11
12
    // IS-54-16 : Behold, I have created the smith who blows the fire of coals
13
    // $options : https://www.php.net/manual/fr/session.configuration.php
14
    public static function getInstance(array $options = []): StateAgentInterface
15
    {
16
        if (is_null(self::$instance)) {
17
            self::$instance = new Smith($options);
18
           
19
        }
20
21
        return self::$instance;
0 ignored issues
show
Bug Best Practice introduced by
The expression return self::instance could return the type null which is incompatible with the type-hinted return HexMakina\BlackBox\StateAgentInterface. Consider adding an additional type-check to rule them out.
Loading history...
22
    }
23
24
    public function start(): string
25
    {
26
        if (self::hasNoSession()) {
27
            session_start();
28
        }
29
30
        return session_name();
31
    }
32
33
    public function set(string $key, $value): void
34
    {
35
        $_SESSION[$key] = $value;
36
    }
37
38
    public function has(string $key): bool
39
    {
40
        return isset($_SESSION[$key]);
41
    }
42
43
    public function get(string $key)
44
    {
45
        return $_SESSION[$key] ?? null;
46
    }
47
48
    private function __construct(array $options = [])
49
    {
50
        if (self::sessionsAreDisabled()) {
51
            throw new \UnexpectedValueException(__CLASS__ . '::PHP_SESSION_DISABLED');
52
        }
53
54
        if (self::hasNoSession()) {
55
            session_name($options['session_name'] ?? StateAgentInterface::DEFAULT_SESSION_NAME);
56
            unset($options['session_name']);
57
            session_start($options); // https://www.php.net/manual/fr/function.session-start.php
58
        }
59
60
    }
61
62
    // camelCase wrapper for setcookie, coherent with getCookie
63
    public function setCookie(
64
        string $name,
65
        string $value = "",
66
        int $expires_in = 365 * 24 * 60 * 60,
67
        string $path = "/",
68
        string $domain = "",
69
        bool $secure = false,
70
        bool $httponly = false
71
    ): bool {
72
        return setcookie($name, $value, time() + $expires_in, $path, $domain, $secure, $httponly);
73
    }
74
75
    // returns the value stored or null
76
    public function getCookie(string $name): ?string
77
    {
78
        return $_COOKIE[$name] ?? null;
79
    }
80
81
    // IS-54-16 : I have also created the ravager to destroy
82
    public function destroy(): bool
83
    {
84
85
        if (ini_get("session.use_cookies")) {
86
            $params = session_get_cookie_params();
87
            setcookie(
88
                session_name(),
89
                '',
90
                time() - 42000,
91
                $params["path"],
92
                $params["domain"],
93
                $params["secure"],
94
                $params["httponly"]
95
            );
96
        }
97
98
        return session_destroy();
99
    }
100
101
102
    private static function sessionsAreDisabled(): bool
103
    {
104
        return session_status() === PHP_SESSION_DISABLED;
105
    }
106
107
    private static function hasNoSession(): bool
108
    {
109
        return session_status() === PHP_SESSION_NONE;
110
    }
111
}
112