Complex classes like Management often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Management, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
22 | trait Management { |
||
23 | /** |
||
24 | * Id of current session |
||
25 | * |
||
26 | * @var false|string |
||
27 | */ |
||
28 | protected $session_id; |
||
29 | /** |
||
30 | * User id of current session |
||
31 | * |
||
32 | * @var int |
||
33 | */ |
||
34 | protected $user_id; |
||
35 | /** |
||
36 | * @var bool |
||
37 | */ |
||
38 | protected $is_admin; |
||
39 | /** |
||
40 | * @var bool |
||
41 | */ |
||
42 | protected $is_user; |
||
43 | /** |
||
44 | * @var bool |
||
45 | */ |
||
46 | protected $is_guest; |
||
47 | /** |
||
48 | * Use cookie as source of session id, load session |
||
49 | */ |
||
50 | 30 | protected function init_session () { |
|
51 | 30 | $Request = Request::instance(); |
|
52 | /** |
||
53 | * If session exists |
||
54 | */ |
||
55 | 30 | if ($Request->cookie('session')) { |
|
56 | 2 | $this->user_id = $this->load(); |
|
57 | } |
||
58 | 30 | $this->update_user_is(); |
|
59 | 30 | } |
|
60 | /** |
||
61 | * Updates information about who is user accessed by methods ::guest() ::user() admin() |
||
62 | */ |
||
63 | 30 | protected function update_user_is () { |
|
64 | 30 | $this->is_guest = $this->user_id == User::GUEST_ID; |
|
65 | 30 | $this->is_user = false; |
|
66 | 30 | $this->is_admin = false; |
|
67 | 30 | if ($this->is_guest) { |
|
68 | 30 | return; |
|
69 | } |
||
70 | /** |
||
71 | * Checking of user type |
||
72 | */ |
||
73 | 22 | $groups = User::instance()->get_groups($this->user_id) ?: []; |
|
74 | 22 | if (in_array(User::ADMIN_GROUP_ID, $groups)) { |
|
75 | 8 | $this->is_admin = true; |
|
76 | 8 | $this->is_user = true; |
|
77 | 16 | } elseif (in_array(User::USER_GROUP_ID, $groups)) { |
|
78 | 16 | $this->is_user = true; |
|
79 | } |
||
80 | 22 | } |
|
81 | /** |
||
82 | * Is admin |
||
83 | * |
||
84 | * @return bool |
||
85 | */ |
||
86 | 10 | public function admin () { |
|
89 | /** |
||
90 | * Is user |
||
91 | * |
||
92 | * @return bool |
||
93 | */ |
||
94 | 2 | public function user () { |
|
95 | 2 | return $this->is_user; |
|
96 | } |
||
97 | /** |
||
98 | * Is guest |
||
99 | * |
||
100 | * @return bool |
||
101 | */ |
||
102 | 8 | public function guest () { |
|
105 | /** |
||
106 | * Returns id of current session |
||
107 | * |
||
108 | * @return false|string |
||
109 | */ |
||
110 | 26 | public function get_id () { |
|
113 | /** |
||
114 | * Returns user id of current session |
||
115 | * |
||
116 | * @return int |
||
117 | */ |
||
118 | 30 | public function get_user () { |
|
121 | /** |
||
122 | * Returns session details by session id |
||
123 | * |
||
124 | * @param false|null|string $session_id If `null` - loaded from `$this->session_id`, and if that also empty - from cookies |
||
125 | * |
||
126 | * @return false|array |
||
127 | */ |
||
128 | 2 | public function get ($session_id) { |
|
133 | /** |
||
134 | * @param false|null|string $session_id |
||
135 | * |
||
136 | * @return false|array |
||
137 | */ |
||
138 | 4 | protected function get_internal ($session_id) { |
|
161 | /** |
||
162 | * Check whether session was not expired, user agent and IP corresponds to what is expected and user is actually active |
||
163 | * |
||
164 | * @param mixed $session_data |
||
165 | * |
||
166 | * @return bool |
||
167 | */ |
||
168 | 4 | protected function is_good_session ($session_data) { |
|
174 | /** |
||
175 | * Whether session data belongs to current visitor (user agent, remote addr and ip check) |
||
176 | * |
||
177 | * @param string $session_id |
||
178 | * @param string $user_agent |
||
179 | * @param string $remote_addr |
||
180 | * @param string $ip |
||
181 | * |
||
182 | * @return bool |
||
183 | */ |
||
184 | 2 | public function is_session_owner ($session_id, $user_agent, $remote_addr, $ip) { |
|
188 | /** |
||
189 | * Whether session data belongs to current visitor (user agent, remote addr and ip check) |
||
190 | * |
||
191 | * @param array $session_data |
||
192 | * @param string|null $user_agent |
||
193 | * @param string|null $remote_addr |
||
194 | * @param string|null $ip |
||
195 | * |
||
196 | * @return bool |
||
197 | */ |
||
198 | 2 | protected function is_session_owner_internal ($session_data, $user_agent = null, $remote_addr = null, $ip = null) { |
|
218 | /** |
||
219 | * Load session by id and return id of session owner (user), update session expiration |
||
220 | * |
||
221 | * @param false|null|string $session_id If not specified - loaded from `$this->session_id`, and if that also empty - from cookies |
||
222 | * |
||
223 | * @return int User id |
||
224 | */ |
||
225 | 2 | public function load ($session_id = null) { |
|
226 | 2 | $session_data = $this->get_internal($session_id); |
|
227 | 2 | if (!$session_data || !$this->is_session_owner_internal($session_data)) { |
|
228 | 2 | $this->add(User::GUEST_ID); |
|
229 | 2 | return User::GUEST_ID; |
|
230 | } |
||
231 | /** |
||
232 | * Updating last online time and ip |
||
233 | */ |
||
234 | 2 | $Config = Config::instance(); |
|
235 | 2 | $time = time(); |
|
236 | 2 | if ($session_data['expire'] - $time < $Config->core['session_expire'] * $Config->core['update_ratio'] / 100) { |
|
237 | 2 | $session_data['expire'] = $time + $Config->core['session_expire']; |
|
238 | 2 | $this->update($session_data); |
|
239 | 2 | $this->cache->set($session_data['id'], $session_data); |
|
240 | 2 | Response::instance()->cookie('session', $session_data['id'], $session_data['expire'], true); |
|
241 | } |
||
242 | 2 | unset($session_data['data']); |
|
243 | 2 | Event::instance()->fire( |
|
244 | 2 | 'System/Session/load', |
|
245 | [ |
||
246 | 2 | 'session_data' => $session_data |
|
247 | ] |
||
248 | ); |
||
249 | 2 | return $this->load_initialization($session_data['id'], $session_data['user']); |
|
250 | } |
||
251 | /** |
||
252 | * Initialize session (set user id, session id and update who user is) |
||
253 | * |
||
254 | * @param string $session_id |
||
255 | * @param int $user_id |
||
256 | * |
||
257 | * @return int User id |
||
258 | */ |
||
259 | 22 | protected function load_initialization ($session_id, $user_id) { |
|
265 | /** |
||
266 | * Whether profile is activated, not disabled and not blocked |
||
267 | * |
||
268 | * @param int $user |
||
269 | * |
||
270 | * @return bool |
||
271 | */ |
||
272 | 22 | protected function is_user_active ($user) { |
|
316 | /** |
||
317 | * Create the session for the user with specified id |
||
318 | * |
||
319 | * @param int $user |
||
320 | * @param bool $delete_current_session |
||
321 | * |
||
322 | * @return false|string Session id on success, `false` otherwise |
||
323 | */ |
||
324 | 22 | public function add ($user, $delete_current_session = true) { |
|
325 | 22 | $user = (int)$user ?: User::GUEST_ID; |
|
326 | 22 | if ($delete_current_session && is_md5($this->session_id)) { |
|
327 | 4 | $this->del($this->session_id); |
|
328 | } |
||
329 | 22 | if (!$this->is_user_active($user)) { |
|
330 | /** |
||
331 | * If data was not loaded or account is not active - create guest session |
||
332 | */ |
||
333 | 4 | return $this->add(User::GUEST_ID); |
|
334 | } |
||
335 | 22 | $session_data = $this->create_unique_session($user); |
|
336 | 22 | Response::instance()->cookie('session', $session_data['id'], $session_data['expire'], true); |
|
337 | 22 | $this->load_initialization($session_data['id'], $session_data['user']); |
|
338 | /** |
||
339 | * Delete old sessions using probability and system configuration of inserts limits and update ratio |
||
340 | */ |
||
341 | 22 | $Config = Config::instance(); |
|
342 | 22 | if (mt_rand(0, $Config->core['inserts_limit']) < $Config->core['inserts_limit'] / 100 * (100 - $Config->core['update_ratio']) / 5) { |
|
343 | 4 | $this->delete_old_sessions(); |
|
344 | } |
||
345 | 22 | Event::instance()->fire( |
|
346 | 22 | 'System/Session/add', |
|
347 | [ |
||
348 | 22 | 'session_data' => $session_data |
|
349 | ] |
||
350 | ); |
||
351 | 22 | return $session_data['id']; |
|
352 | } |
||
353 | /** |
||
354 | * @param int $user |
||
355 | * |
||
356 | * @return array Session data |
||
357 | */ |
||
358 | 22 | protected function create_unique_session ($user) { |
|
386 | /** |
||
387 | * Destroying of the session |
||
388 | * |
||
389 | * @param null|string $session_id |
||
390 | * |
||
391 | * @return bool |
||
392 | */ |
||
393 | 10 | public function del ($session_id = null) { |
|
423 | /** |
||
424 | * Delete all old sessions from DB |
||
425 | */ |
||
426 | 4 | protected function delete_old_sessions () { |
|
432 | /** |
||
433 | * Deletion of all user sessions |
||
434 | * |
||
435 | * @param false|int $user If not specified - current user assumed |
||
436 | * |
||
437 | * @return bool |
||
438 | */ |
||
439 | 16 | public function del_all ($user = false) { |
|
462 | } |
||
463 |