Last active
April 12, 2016 09:55
-
-
Save radutopala/70af392ee2c6a22d4d457dc57378b8b7 to your computer and use it in GitHub Desktop.
Api Exception Listener
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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