+160
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
<?php
class UserSessionComponent extends Component {
//...
protected function loginByUserId($user_id, $is_autologin = false) {
$list = $this->_loadComponents($this->components, array('UserAuth'));
$userAuth = $list['UserAuth'];
$userAuth->startup($this->controller); # !!! WORKFLOW VIOLATION !!!
$method = $is_autologin ? 'autologin' : 'login';
if ($userAuth->$method($user_id)) {
return $this->controller->Session->read('User.data');
}
}
//...
}
class UserAuthComponent extends BaseMagicComponent {
protected $loginType = 'explicit';
//...
public function autologin($params = array()) {
$this->loginType = 'implicit';
return $this->_login($params);
}
public function login($params = array()) {
$this->loginType = 'explicit';
return $this->_login($params);
}
//...
protected function _login($params = array()) {
switch (true) {
case (is_array($params) && isset($params['user']) && isset($params['password'])):
$result = $this->loginByUserAndPassword($params['user'], $params['password']);
break;
case (is_numeric($params) && $params > 0):
$result = $this->loginUser($params);
break;
default:
if (empty($params)) {
$result = false;
} else {
$result = $this->loginUser($params);
}
}
// ...
}
// ...
public function loginUser($user) {
switch (true) {
case is_object($user):
if (isset($user->data)) {
$a_user = $user->data;
} else {
return false;
}
break;
case (is_numeric($user) && ($user > 0)):
if (!($a_user = $this->User->findById($user))) {
return false;
}
break;
case (is_array($user) && (isset($user['User']['id']))):
$a_user = $user;
break;
default:
return false;
}
// ...
CFL::using('log');
if (empty($GLOBALS['loginIsLogged'])) {
$loginLog = new cflLoginTrackingLogger();
if ($this->loginType == 'implicit') {
$loginLog->implicit_login(array('user_id' => $a_user['User']['id']));
} else {
$loginLog->explicit_login(array('user_id' => $a_user['User']['id']));
}
$GLOBALS['loginIsLogged'] = true;
}
// ...
}
}
Сорри за много-много кода, еле-еле вписался в лимит. Но пришлось запостить все. Логическая цепочка совершенно потрясающая (смотрим с самого верхнего метода и идем дальше к самому нижнему методу). Тут у нас кода просто по колено: сумасшедший пахлава-код, использование глобальной переменной флага, особое извращенное использование конструкции switch, фактическое дублирование этого самого switch в двух последних методах, нейминг переменных и методов...
Казалось бы, как все это вообще могло быть написано? Но использование компонента с говорящим именем BaseMagic все ставит на свои места.
Запостил: quall,
09 Февраля 2011
quall 09.02.2011 11:16 # −1
quall 09.02.2011 11:17 # −1
bugmenot 09.02.2011 11:19 # +10
Анонимус 09.02.2011 15:45 # +2
Lure Of Chaos 09.02.2011 18:25 # +2
Lure Of Chaos 09.02.2011 13:32 # +1
gegMOPO4 09.02.2011 13:42 # +2
ZX_Spectrum 10.02.2011 06:13 # 0
Int 09.02.2011 23:03 # +2