Cake:以组件中的静态方法访问控制器

时间:2014-02-13 08:23:27

标签: cakephp cakephp-2.4

我们在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;
    }

但是,我负责软件质量的团队同事并不觉得这个解决方案令人满意。他说:“请找一个更好的方法将控制器传递给解码方法。将控制器设置为静态变量并不是最好的方法”。

有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

我认为问题在于你的方法做了两件不同的事情:解码和错误处理。我会将此功能移到您处理其他异常的位置而不是处理方法中的IncorrectCredentialsException,而只是在方法中抛出IncorrectCredentialsException。通过此更改,您不再需要以静态方法访问控制器。