public function onKernelException(GetResponseForExceptionEvent $event)
 {
     $e = $event->getException();
     $statusCode = $e instanceof HttpExceptionInterface ? $e->getStatusCode() : 500;
     // allow 500 errors to be thrown
     if ($this->debug && $statusCode >= 500) {
         return;
     }
     if ($e instanceof ApiProblemException) {
         $apiProblem = $e->getApiProblem();
     } else {
         $apiProblem = new ApiProblem($statusCode);
         /*
          * If it's an HttpException message (e.g. for 404, 403),
          * we'll say as a rule that the exception message is safe
          * for the client. Otherwise, it could be some sensitive
          * low-level exception, which should *not* be exposed
          */
         if ($e instanceof HttpExceptionInterface) {
             $apiProblem->set('detail', $e->getMessage());
         }
     }
     $data = $apiProblem->toArray();
     $response = new JsonResponse($data, $apiProblem->getStatusCode());
     $response->headers->set('Content-Type', 'application/json');
     $event->setResponse($response);
 }
 /**
  * ApiProblemException constructor.
  *
  * @param \BiteCodes\RestApiGeneratorBundle\Api\Response\ApiProblem $apiProblem
  * @param \Exception|null $previous
  * @param array $headers
  * @param int $code
  */
 public function __construct(ApiProblem $apiProblem, \Exception $previous = null, array $headers = array(), $code = 0)
 {
     $this->apiProblem = $apiProblem;
     $statusCode = $apiProblem->getStatusCode();
     $message = $apiProblem->getTitle();
     parent::__construct($statusCode, $message, $previous, $headers, $code);
 }
 /** @test */
 public function it_sorts_the_response_data()
 {
     $response = new ApiProblem(404, null, ['my_stuff' => 'comes here']);
     $response->set('meta', 'will be here');
     $response->set('additional_data', 'will be here');
     $data = $response->toArray();
     $keys = array_keys($data);
     $this->assertEquals('status', $keys[0]);
     $this->assertEquals('type', $keys[1]);
     $this->assertEquals('title', $keys[2]);
     $this->assertEquals('data', $keys[3]);
     $this->assertEquals('additional_data', $keys[4]);
     $this->assertEquals('meta', $keys[5]);
 }
 /**
  * Validate json decoding
  */
 protected function validateJsonContent()
 {
     switch (json_last_error()) {
         case JSON_ERROR_DEPTH:
             $error = 'Maximum stack depth exceeded';
             break;
         case JSON_ERROR_CTRL_CHAR:
             $error = 'Unexpected control character found';
             break;
         case JSON_ERROR_SYNTAX:
             $error = 'Syntax error, malformed JSON';
             break;
     }
     if (!empty($error)) {
         $problem = new ApiProblem(400, ApiProblem::TYPE_INVALID_REQUEST_BODY_FORMAT);
         $problem->set('error', $error);
         throw new ApiProblemException($problem);
     }
 }
 /**
  * @param $errors
  * @return ApiProblemException
  */
 protected function createValidationErrorException($errors)
 {
     $problem = new ApiProblem(422, ApiProblem::TYPE_VALIDATION_ERROR);
     $problem->set('errors', $errors);
     return new ApiProblemException($problem);
 }