src/Framework/EventListener/APISerializerEventListener.php line 23

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\Framework\EventListener;
  3. use App\Framework\Serializer\APISerializerGroup;
  4. use ReflectionMethod;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  8. use Symfony\Component\HttpKernel\Event\ViewEvent;
  9. use Symfony\Component\HttpKernel\HttpKernelInterface;
  10. use Symfony\Component\Serializer\SerializerInterface;
  11. class APISerializerEventListener
  12. {
  13.     private SerializerInterface $serializer;
  14.     public function __construct(SerializerInterface $serializer)
  15.     {
  16.         $this->serializer $serializer;
  17.     }
  18.     public function onKernelController(ControllerEvent $event): void
  19.     {
  20.         $request $event->getRequest();
  21.         if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
  22.             return;
  23.         }
  24.         $controller $event->getController();
  25.         $reflection = new ReflectionMethod($controller[0], $controller[1]);
  26.         $attrs $reflection->getAttributes(APISerializerGroup::class);
  27.         // TODO: Anyway to prevent multiple of one attribute?
  28.         $groups = [];
  29.         foreach ($attrs as $attr) {
  30.             $attrInstance $attr->newInstance();
  31.             foreach ($attrInstance->groups as $g) {
  32.                 $groups[] = $g;
  33.             }
  34.         }
  35.         if (count($groups) === 0) {
  36.             $groups[] = 'default';
  37.         }
  38.         $request->attributes->set('api_serializer_groups'$groups);
  39.     }
  40.     public function onKernelView(ViewEvent $event): void
  41.     {
  42.         $request $event->getRequest();
  43.         if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
  44.             return;
  45.         }
  46.         // Normalize the result
  47.         $groups $request->attributes->get('api_serializer_groups');
  48.         $result $this->serializer->normalize($event->getControllerResult(), null, ['groups' => $groups]);
  49.         // Convert normalized result to proper Response
  50.         if (in_array('application/json'$request->getAcceptableContentTypes(), true)) {
  51.             // Convert to a json response
  52.             $response = new JsonResponse($result);
  53.             $event->setResponse($response);
  54.         } else {
  55.             // Convert to a html response
  56.             $content json_encode($resultJSON_PRETTY_PRINT);
  57.             $response = new Response();
  58.             $response->setContent(
  59.                 '<html><body><pre class="prettyprint lang-json">' .
  60.                 htmlspecialchars($content) .
  61.                 '</pre>' .
  62.                 '<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>' .
  63.                 '</body></html>'
  64.             );
  65.             $event->setResponse($response);
  66.         }
  67.     }
  68. }