Passed
Push — main ( 8522a5...443191 )
by Sammy
16:36 queued 09:15
created

Smith::destroy()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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