2014-02-13 57 views
0

我們在Cake組件中有一個靜態方法。如果此組件引發特定錯誤,則該任務是將用戶重定向到登錄頁面。目前的(工作)的解決方案是: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

我認爲問題在於你的方法做了兩件事:解碼和錯誤處理。我不會在你的方法中處理IncorrectCredentialsException,而是將這個功能移到你處理其他異常的地方,並在你的方法中拋出一個IncorrectCredentialsException。通過此更改,您不再需要使用靜態方法訪問控制器。

相關問題