vendor/friendsofsymfony/rest-bundle/EventListener/ViewResponseListener.php line 46

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSRestBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace FOS\RestBundle\EventListener;
  11. use FOS\RestBundle\Controller\Annotations\View as ViewAnnotation;
  12. use FOS\RestBundle\FOSRestBundle;
  13. use FOS\RestBundle\View\View;
  14. use FOS\RestBundle\View\ViewHandlerInterface;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Event\ViewEvent;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. use Symfony\Component\Templating\TemplateReferenceInterface;
  21. /**
  22.  * The ViewResponseListener class handles the View core event as well as the "@extra:Template" annotation.
  23.  *
  24.  * @author Lukas Kahwe Smith <smith@pooteeweet.org>
  25.  *
  26.  * @internal
  27.  */
  28. class ViewResponseListener implements EventSubscriberInterface
  29. {
  30.     private $viewHandler;
  31.     private $forceView;
  32.     public function __construct(ViewHandlerInterface $viewHandlerbool $forceView)
  33.     {
  34.         $this->viewHandler $viewHandler;
  35.         $this->forceView $forceView;
  36.     }
  37.     /**
  38.      * @param ViewEvent $event
  39.      */
  40.     public function onKernelView($event)
  41.     {
  42.         $request $event->getRequest();
  43.         if (!$request->attributes->get(FOSRestBundle::ZONE_ATTRIBUTEtrue)) {
  44.             return false;
  45.         }
  46.         $configuration $request->attributes->get('_template');
  47.         $view $event->getControllerResult();
  48.         if (!$view instanceof View) {
  49.             if (!$configuration instanceof ViewAnnotation && !$this->forceView) {
  50.                 return;
  51.             }
  52.             $view = new View($view);
  53.         }
  54.         if ($configuration instanceof ViewAnnotation) {
  55.             if ($configuration->getTemplateVar(false)) {
  56.                 $view->setTemplateVar($configuration->getTemplateVar(false), false);
  57.             }
  58.             if (null !== $configuration->getStatusCode() && (null === $view->getStatusCode() || Response::HTTP_OK === $view->getStatusCode())) {
  59.                 $view->setStatusCode($configuration->getStatusCode());
  60.             }
  61.             $context $view->getContext();
  62.             if ($configuration->getSerializerGroups()) {
  63.                 if (null === $context->getGroups()) {
  64.                     $context->setGroups($configuration->getSerializerGroups());
  65.                 } else {
  66.                     $context->setGroups(array_merge($context->getGroups(), $configuration->getSerializerGroups()));
  67.                 }
  68.             }
  69.             if ($configuration->getSerializerEnableMaxDepthChecks()) {
  70.                 $context->setMaxDepth(0false);
  71.             }
  72.             if (true === $configuration->getSerializerEnableMaxDepthChecks()) {
  73.                 $context->enableMaxDepth();
  74.             } elseif (false === $configuration->getSerializerEnableMaxDepthChecks()) {
  75.                 $context->disableMaxDepth();
  76.             }
  77.             $owner $configuration->getOwner();
  78.             if ([] === $owner || null === $owner) {
  79.                 $controller $action null;
  80.             } else {
  81.                 [$controller$action] = $owner;
  82.             }
  83.             $vars $this->getDefaultVars($configuration$controller$action);
  84.         } else {
  85.             $vars = [];
  86.         }
  87.         if (null === $view->getFormat()) {
  88.             $view->setFormat($request->getRequestFormat());
  89.         }
  90.         if ($this->viewHandler->isFormatTemplating($view->getFormat(), false)
  91.             && !$view->getRoute()
  92.             && !$view->getLocation()
  93.         ) {
  94.             if (!== count($vars)) {
  95.                 $parameters = (array) $this->viewHandler->prepareTemplateParameters($viewfalse);
  96.                 foreach ($vars as $var) {
  97.                     if (!array_key_exists($var$parameters)) {
  98.                         $parameters[$var] = $request->attributes->get($var);
  99.                     }
  100.                 }
  101.                 $view->setData($parameters);
  102.             }
  103.             if ($configuration && ($template $configuration->getTemplate()) && !$view->getTemplate(false)) {
  104.                 if ($template instanceof TemplateReferenceInterface) {
  105.                     $template->set('format'null);
  106.                 }
  107.                 $view->setTemplate($templatefalse);
  108.             }
  109.         }
  110.         $response $this->viewHandler->handle($view$request);
  111.         $event->setResponse($response);
  112.     }
  113.     public static function getSubscribedEvents(): array
  114.     {
  115.         // Must be executed before SensioFrameworkExtraBundle's listener
  116.         return [
  117.             KernelEvents::VIEW => ['onKernelView'30],
  118.         ];
  119.     }
  120.     /**
  121.      * @param object $controller
  122.      */
  123.     private function getDefaultVars(Template $template null$controllerstring $action): array
  124.     {
  125.         if (!== count($arguments $template->getVars())) {
  126.             return $arguments;
  127.         }
  128.         if (!$template instanceof ViewAnnotation || $template->isPopulateDefaultVars(false)) {
  129.             $r = new \ReflectionObject($controller);
  130.             $arguments = [];
  131.             foreach ($r->getMethod($action)->getParameters() as $param) {
  132.                 $arguments[] = $param->getName();
  133.             }
  134.             return $arguments;
  135.         }
  136.         return [];
  137.     }
  138. }