2016-01-16 63 views
4

我剛剛完成創建一個slim框架的API應用程序,最初,在我的代碼中,我使用依賴容器來處理所有拋出的異常,代碼如下。PHP:瘦框架異常處理

//Add container to handle all exceptions/errors, fail safe and return json 
$container['errorHandler'] = function ($container) { 
    return function ($request, $response, $exception) use ($container) { 
     //Format of exception to return 
     $data = [ 
      'message' => $exception->getMessage() 
     ]; 
     return $container->get('response')->withStatus(500) 
      ->withHeader('Content-Type', 'application/json') 
      ->write(json_encode($data)); 
    }; 
}; 

但不是扔我想補充其他HTTPS效應初探碼500 Server Error所有的時間。我想知道我能否在如何解決這個問題上得到幫助。

public static function decodeToken($token) 
{ 
    $token = trim($token); 
    //Check to ensure token is not empty or invalid 
    if ($token === '' || $token === null || empty($token)) { 
     throw new JWTException('Invalid Token'); 
    } 
    //Remove Bearer if present 
    $token = trim(str_replace('Bearer ', '', $token)); 

    //Decode token 
    $token = JWT::decode($token, getenv('SECRET_KEY'), array('HS256')); 

    //Ensure JIT is present 
    if ($token->jit == null || $token->jit == "") { 
     throw new JWTException('Invalid Token'); 
    } 

    //Ensure User Id is present 
    if ($token->data->uid == null || $token->data->uid == "") { 
     throw new JWTException("Invalid Token"); 
    } 
    return $token; 
} 

的問題更是從像上面一個功能,因爲苗條的框架決定隱式處理所有的異常,我無法獲得使用try catch捕捉任何錯誤

回答

2

並不難,它是簡單。重寫代碼:

container['errorHandler'] = function ($container) { 
    return function ($request, $response, $exception) use ($container) { 
     //Format of exception to return 
     $data = [ 
      'message' => $exception->getMessage() 
     ]; 
     return $container->get('response')->withStatus($response->getStatus()) 
      ->withHeader('Content-Type', 'application/json') 
      ->write(json_encode($data)); 
    }; 
} 

那麼這段代碼是做什麼的?您基本上像之前一樣通過$response,並且此代碼執行的操作是從$response對象獲取狀態代碼並將其傳遞給withStatus()方法。

Slim Documentation for referring to status.

+0

是啊,這工作,但問題是,我使用這個容器來捕獲不能訪問$ response對象的不同方法的自定義拋出異常,所以我不能從那些拋出異常的函數設置狀態代碼,並且slim框架不允許我捕獲這些異常。 –

+0

@JamesOkpeGeorge恕我直言,你應該創建一個'Response'類的新對象,然後傳遞它。 –

+0

@JamesOkpeGeorge此外,爲您的新問題,創建一個新的問題。 –

0

你可以使用withJson()方法Slim\Http\Response對象的

class CustomExceptionHandler 
{ 

    public function __invoke(Request $request, Response $response, Exception $exception) 
    { 
     $errors['errors'] = $exception->getMessage(); 
     $errors['responseCode'] = 500; 

     return $response 
      ->withStatus(500) 
      ->withJson($errors); 
    } 
} 

,如果你正在使用依賴注入,你可以做

$container = $app->getContainer(); 

//error handler 
$container['errorHandler'] = function (Container $c) { 
    return new CustomExceptionHandler(); 
};