2016-01-16 2 views
4

Я только что закончил создание приложения API с тонким фреймворком, изначально в моем коде я использую контейнер зависимостей для обработки всех исключений, приведенных ниже.PHP: обработка исключений для Slim Framework

//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)); 
    }; 
}; 

Но вместо того, чтобы бросать 500 Server Error все время я хотел бы добавить другой код HTTPS réponse. Интересно, могу ли я получить помощь в том, как это сделать.

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 framework, не позволяет мне фиксировать эти исключения. –

+0

@JamesOkpeGeorge IMHO, вы должны создать новый объект класса '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(); 
};