我们在Cake组件中有一个静态方法。如果此组件抛出特定错误,则任务是将用户重定向到登录页面。当前(工作)解决方案是:
class SomeComponent extends Component {
static $controllerObject;
function startup(&$controller) {
SomeComponent::$controllerObject =& $controller;
}
(...)
public static function decodeResponse($response) {
if($response == null || trim($response) == '') {
return null;
}
$result = json_decode($response, true);
if($result == null) {
throw new FatalErrorException('Could not parse api server response: ' . $response);
}
if(isset($result['error'])) {
if ($result['error'] === "IncorrectCredentialsException") {
self::$controllerObject->Session->destroy();
self::$controllerObject->Session->setFlash(__('Your session has ended. Please log in again.', true), 'default', array(), 'error');
self::$controllerObject->redirect(array(
'language' => Configure::read('Config.language'),
'controller' => 'users',
'action' => 'login'
));
}
else { throw new ApiServerException($result); }
}
return $result;
}
但是,我负责软件质量的团队同事并不觉得这个解决方案令人满意。他说:“请找一个更好的方法将控制器传递给解码方法。将控制器设置为静态变量并不是最好的方法”。
有没有更好的方法呢?
答案 0 :(得分:1)
我认为问题在于你的方法做了两件不同的事情:解码和错误处理。我会将此功能移到您处理其他异常的位置而不是处理方法中的IncorrectCredentialsException
,而只是在方法中抛出IncorrectCredentialsException
。通过此更改,您不再需要以静态方法访问控制器。