Skip to content

Commit 1c450e8

Browse files
committed
improved UserSession class
1 parent 3a727a8 commit 1c450e8

File tree

3 files changed

+96
-16
lines changed

3 files changed

+96
-16
lines changed

app/base/tools/DataCollector/UserDataCollector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function collect(): array
5252
'username' => $this->subject->getUsername(),
5353
'since' => ($this->subject instanceof GuestUser) ? null : $this->subject->getCreatedAt(),
5454
'role' => $this->subject->getRole()->getName(),
55-
'session' => json_encode($this->subject->getUserSession() ? $this->subject->getUserSession()->getSessionData() : null),
55+
'session' => ($this->subject->getUserSession() ? $this->subject->getUserSession()->getSessionData() : null),
5656
];
5757
}
5858

app/site/controllers/Frontend/Users/Login.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ public function formSubmitted(FAPI\Form $form, &$form_state)
225225
/** @var User $logged_user */
226226
$logged_user = $form_state['logged_user'];
227227
$logged_user->getUserSession()->addSessionData('last_login', new \DateTime())->persist();
228+
228229
return "" . $logged_user->getJWT();
229230
}
230231

app/site/models/UserSession.php

Lines changed: 94 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,9 @@
1414

1515
use App\Base\Abstracts\Models\BaseModel;
1616
use \DateTime;
17-
use Degami\Basics\Exceptions\BasicException;
18-
use DI\DependencyException;
19-
use DI\NotFoundException;
20-
use Exception;
2117

2218
/**
23-
* User Model
19+
* User Session Model
2420
*
2521
* @method int getId()
2622
* @method int getWebsiteId()
@@ -37,46 +33,129 @@
3733
*/
3834
class UserSession extends BaseModel
3935
{
36+
/** @var array|null */
37+
protected $session_data_array = null;
38+
39+
/**
40+
* {@inheritdoc}
41+
*
42+
* @return BaseModel
43+
*/
4044
public function postLoad(): BaseModel
4145
{
42-
$session_data = json_decode($this->getSessionData(), true);
43-
if (!is_array($session_data)) {
44-
$session_data = [$session_data];
45-
}
46-
$this->setSessionData($session_data);
46+
$this->session_data_array = $this->getNormalizedSessionData();
47+
4748
return parent::postLoad();
4849
}
4950

51+
/**
52+
* {@inheritdoc}
53+
*
54+
* @return BaseModel
55+
*/
5056
public function prePersist(): BaseModel
5157
{
52-
$this->setSessionData(json_encode($this->getSessionData()));
58+
$this->setSessionData(json_encode($this->getNormalizedSessionData()));
5359
return parent::prePersist();
5460
}
5561

56-
public function addSessionData($key, $value): UserSession
62+
/**
63+
* gets session data as array
64+
* @return array
65+
*/
66+
protected function getNormalizedSessionData(): array
5767
{
68+
if (is_array($this->session_data_array)) {
69+
return $this->session_data_array;
70+
}
71+
5872
$session_data = $this->getSessionData();
59-
$session_data[$key] = $value;
60-
$this->setSessionData($session_data);
73+
if (is_string($session_data)) {
74+
$session_data = json_decode($session_data, true);
75+
}
76+
if (!is_array($session_data)) {
77+
if (!is_null($session_data)) {
78+
$session_data = [$session_data];
79+
} else {
80+
$session_data = [];
81+
}
82+
}
83+
84+
return $session_data;
85+
}
86+
87+
/**
88+
* adds data to User Session Object
89+
*
90+
* @param string $key
91+
* @param mixed $value
92+
* @return self
93+
*/
94+
public function addSessionData(string $key, $value): UserSession
95+
{
96+
$session_data = $this->getNormalizedSessionData();
97+
if (static::isEncodable($value)) {
98+
$session_data[$key] = $value;
99+
$this->session_data_array = $session_data;
100+
}
61101

62102
return $this;
63103
}
64104

105+
/**
106+
* sets input array values as session values
107+
*
108+
* @param array $data
109+
* @return self
110+
*/
65111
public function arrayToSessionData(array $data): UserSession
66112
{
67113
$this->clearSessionData();
68114

69115
foreach ($data as $key => $value) {
116+
if (!static::isEncodable($value)) {
117+
continue;
118+
}
70119
$this->addSessionData($key, $value);
71120
}
72121

73122
return $this;
74123
}
75124

125+
/**
126+
* removes session data value by key
127+
*
128+
* @param string $key
129+
* @return self
130+
*/
131+
public function removeSessionData(string $key): UserSession
132+
{
133+
$session_data = $this->getNormalizedSessionData();
134+
unset($session_data[$key]);
135+
$this->session_data_array = $session_data;
136+
137+
return $this;
138+
}
139+
140+
/**
141+
* removes session data
142+
*
143+
* @return self
144+
*/
76145
public function clearSessionData(): UserSession
77146
{
78-
$this->setSessionData([]);
147+
$this->session_data_array = [];
79148

80149
return $this;
81150
}
151+
152+
/**
153+
* checks if parameter is json representable
154+
* @param mixed $var
155+
* @return bool
156+
*/
157+
protected static function isEncodable($var): bool
158+
{
159+
return json_encode($var) !== false;
160+
}
82161
}

0 commit comments

Comments
 (0)