Skip to content

Instantly share code, notes, and snippets.

@radutopala
Last active April 12, 2016 09:55
Show Gist options
  • Save radutopala/70af392ee2c6a22d4d457dc57378b8b7 to your computer and use it in GitHub Desktop.
Save radutopala/70af392ee2c6a22d4d457dc57378b8b7 to your computer and use it in GitHub Desktop.
Api Exception Listener
<?php
namespace TSS\CoreBundle\EventListener;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
class ApiExceptionListener
{
protected $logger;
protected $kernel;
public function __construct(LoggerInterface $logger = null, $kernel)
{
$this->logger = $logger;
$this->kernel = $kernel;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
if (strpos($event->getRequest()->getRequestUri(), '/api') === 0) {
$this->logException($event->getException(), sprintf('Uncaught API PHP Exception %s: "%s" at %s line %s', get_class($event->getException()), $event->getException()->getMessage(), $event->getException()->getFile(), $event->getException()->getLine()));
$code = $event->getException() instanceof HttpExceptionInterface
? $event->getException()->getStatusCode()
: Response::HTTP_INTERNAL_SERVER_ERROR;
$data = [
'code' => $code,
'message' => $this->kernel->isDebug() ? $event->getException()->getMessage() : 'Invalid request',
];
$response = new JsonResponse($data, $code);
$response->headers->set('X-Exception-Message', $event->getException()->getMessage());
$event->setResponse($response);
}
}
/**
* Logs an exception.
*
* @param \Exception $exception The \Exception instance
* @param string $message The error message to log
*/
protected function logException(\Exception $exception, $message)
{
if (null !== $this->logger) {
if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) {
$this->logger->critical($message, array('exception' => $exception));
} else {
$this->logger->error($message, array('exception' => $exception));
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment