2014-02-13 3 views
0

У нас есть статический метод в компоненте 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; 
    } 

Однако моя команда коллега, который отвечает за качество программного обеспечения, не находит это решение удовлетворяет. Он говорит: «PLS найдет лучший способ передать контроллер методу декодирования. Установка контроллера как статической переменной - это не лучший способ».

Есть ли лучший способ сделать это?

ответ

1

Я думаю, проблема в том, что ваш метод выполняет две разные вещи: декодирование и обработку ошибок. Вместо того, чтобы обрабатывать IncorrectCredentialsException внутри вашего метода, я бы переместил эту функциональность туда, где вы обрабатываете другие исключения, и просто бросайте IncorrectCredentialsException в свой метод. С этим изменением вам больше не нужно обращаться к контроллеру в вашем статическом методе.