<?php
/**
* Created by PhpStorm.
* User: mitchellherrijgers
* Date: 19-10-16
* Time: 16:20
*/
namespace WebserviceBundle\Event;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\Serializer;
use Symfony\Bridge\Monolog\Logger;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\Validator\Exception\ValidatorException;
use WmsBundle\Exceptions\ProcessException;
use WmsBundle\Services\LoggerService;
/**
* Class ExceptionListener
* @package WebserviceBundle\Event
*/
class ExceptionListener
{
/** @var Serializer */
protected $serializer;
/** @var LoggerService */
protected $loggerService;
/**
* ExceptionListener constructor.
* @param Serializer $serializer
* @param Logger $logger
*/
public function __construct(Serializer $serializer, LoggerService $loggerService)
{
$this->serializer = $serializer;
$this->loggerService = $loggerService;
}
/**
* @param GetResponseForExceptionEvent $event
* @throws \InvalidArgumentException
*/
public function onKernelException(GetResponseForExceptionEvent $event)
{
// custom validator exception
if ($event->getException() instanceof \WmsBundle\Exceptions\ValidatorException) {
$response = new JsonResponse(
[
'errors' => [$event->getException()->getMessage()],
],
$event->getException()->getCode()
);
$event->setResponse($response);
return;
}
if (!$event->getException() instanceof ProcessException && !$event->getException() instanceof ValidatorException) {
return;
}
/** @var ProcessException $e */
$e = $event->getException();
$response = null;
if (method_exists($e, 'getTasks') && is_array($e->getTasks())) {
$context = SerializationContext::create()->setGroups([
'id',
'tasks',
'locations',
'variants',
'users',
'address'
]);
$response = new Response(
$this->serializer->serialize(
$e->getTasks(),
'json',
$context
),
409
);
} else {
$response = new Response(
$e->getMessage(),
412,
[
'Content-Type' => 'text/plain'
]
);
}
if ($e instanceof ProcessException) {
$this->loggerService->logTaskException($e);
}
$event->setResponse($response);
}
}