Passed
Branch main (1437de)
by Sammy
06:42
created

Smith::__construct()   A

Complexity

Conditions 6
Paths 17

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 14
nc 17
nop 1
dl 0
loc 24
rs 9.2222
c 1
b 0
f 0
1
<?php
2
3
namespace HexMakina\StateAgent;
4
5
use HexMakina\BlackBox\StateAgentInterface;
6
7
class Smith implements StateAgentInterface
8
{
9
10
    private static $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($options = []): StateAgentInterface
15
    {
16
        if (is_null(self::$instance)) {
17
            self::$instance = new Smith($options);
18
        }
19
20
        return self::$instance;
21
    }
22
23
    private function __construct($options = [])
24
    {
25
        switch(session_status())
26
        {
27
          case PHP_SESSION_DISABLED:
28
            throw new \UnexpectedValueException(__CLASS__.'::PHP_SESSION_DISABLED');
29
30
          case PHP_SESSION_NONE:
31
            session_name($options['session_name'] ?? StateAgentInterface::DEFAULT_SESSION_NAME);
32
            unset($options['session_name']);
33
            session_start($options); // https://www.php.net/manual/fr/function.session-start.php
34
          break;
35
        }
36
37
        if (!isset($_SESSION[self::INDEX_MESSAGES])) {
38
            $_SESSION[self::INDEX_MESSAGES] = [];
39
        }
40
41
        if (!isset($_SESSION[self::INDEX_FILTER])) {
42
            $_SESSION[self::INDEX_FILTER] = [];
43
        }
44
45
        if (!isset($_SESSION[self::INDEX_OPERATOR])) {
46
            $_SESSION[self::INDEX_OPERATOR] = [];
47
        }
48
    }
49
50
51
52
    // camelCase wrapper for setcookie, coherent with getCookie
53
    public function setCookie($name, $value = "", $expires_in = 365 * 24 * 60 * 60, $path = "/", $domain = "", $secure = false, $httponly = false): bool
54
    {
55
        return setcookie($name, $value, time() + $expires_in, $path, $domain, $secure, $httponly);
56
    }
57
58
    // returns the value stored or null
59
    public function getCookie($name)
60
    {
61
        return $_COOKIE[$name] ?? null;
62
    }
63
64
65
66
67
    // IS-54-16 : and produces a weapon for its purpose
68
    public function addMessage($level, $message, $context = [])
69
    {
70
        if (!isset($_SESSION[self::INDEX_MESSAGES][$level])) {
71
            $_SESSION[self::INDEX_MESSAGES][$level] = [];
72
        }
73
74
        $_SESSION[self::INDEX_MESSAGES][$level][] = [$message, $context];
75
    }
76
77
    public function messages($level = null)
78
    {
79
        if (is_null($level)) {
80
            return $_SESSION[self::INDEX_MESSAGES];
81
        }
82
83
        return $_SESSION[self::INDEX_MESSAGES][$level] ?? null;
84
    }
85
86
    public function resetMessages($level = null)
87
    {
88
        $this->reset(self::INDEX_MESSAGES, $level);
89
    }
90
91
92
93
94
    public function addRuntimeFilters($filters)
95
    {
96
        $_SESSION[self::INDEX_FILTER] = array_merge($_SESSION[self::INDEX_FILTER], $filters);
97
    }
98
99
    public function hasFilter($filter_name): bool
100
    {
101
        return isset($_SESSION[self::INDEX_FILTER][$filter_name]) && strlen('' . $_SESSION[self::INDEX_FILTER][$filter_name]) > 0;
102
    }
103
104
    public function addFilter($filter_name, $value)
105
    {
106
        $_SESSION[self::INDEX_FILTER][$filter_name] = $value;
107
    }
108
109
    public function filters($filter_name = null, $value = null)
110
    {
111
        if (is_null($filter_name)) {
112
            return $_SESSION[self::INDEX_FILTER];
113
        }
114
115
        if (!is_null($value)) {
116
            $this->addFilter($filter_name, $value);
117
        }
118
119
        return $_SESSION[self::INDEX_FILTER][$filter_name] ?? null;
120
    }
121
122
    public function resetFilters($filter_name = null)
123
    {
124
        $this->reset(self::INDEX_FILTER, $filter_name);
125
    }
126
127
128
    public function operatorId($setter = null)
129
    {
130
        if (!is_null($setter)) {
131
            $_SESSION[self::INDEX_OPERATOR] = ['id' => $setter, 'set_on' => time()];
132
        }
133
134
        return $_SESSION[self::INDEX_OPERATOR]['id'] ?? null;
135
    }
136
137
    public function operatorCheckinDate()
138
    {
139
        return $_SESSION[self::INDEX_OPERATOR]['set_on'] ?? null;
140
    }
141
142
    // IS-54-16 : I have also created the ravager to destroy
143
    public function destroy(): bool
144
    {
145
146
        if (ini_get("session.use_cookies")) {
147
            $params = session_get_cookie_params();
148
            setcookie(
149
                session_name(),
150
                '',
151
                time() - 42000,
152
                $params["path"],
153
                $params["domain"],
154
                $params["secure"],
155
                $params["httponly"]
156
            );
157
        }
158
        return session_destroy();
159
    }
160
161
    private function reset($index, $part = null)
162
    {
163
        if (is_null($part)) {
164
            $_SESSION[$index] = [];
165
        } else {
166
            unset($_SESSION[$index][$part]);
167
        }
168
    }
169
}
170