vendor/kunstmaan/node-bundle/EventListener/RenderContextListener.php line 23

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\NodeBundle\EventListener;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Kunstmaan\NodeBundle\Entity\NodeVersion;
  5. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpKernel\Event\ViewEvent;
  8. class RenderContextListener
  9. {
  10.     /**
  11.      * @var EntityManagerInterface
  12.      */
  13.     protected $em;
  14.     public function __construct(EntityManagerInterface $em)
  15.     {
  16.         $this->em $em;
  17.     }
  18.     public function onKernelView(ViewEvent $event)
  19.     {
  20.         $response $event->getControllerResult();
  21.         if ($response instanceof Response) {
  22.             // If it's a response, just continue
  23.             return;
  24.         }
  25.         $request $event->getRequest();
  26.         if ($request->attributes->has('_template')) { // template is already set
  27.             return;
  28.         }
  29.         $nodeTranslation $request->attributes->get('_nodeTranslation');
  30.         if ($nodeTranslation) {
  31.             $entity $request->attributes->get('_entity');
  32.             $url $request->attributes->get('url');
  33.             $nodeMenu $request->attributes->get('_nodeMenu');
  34.             $parameters $request->attributes->get('_renderContext');
  35.             if ($request->attributes->get('preview') === true) {
  36.                 $version $request->query->get('version');
  37.                 if (!empty($version) && is_numeric($version)) {
  38.                     $nodeVersion $this->em->getRepository(NodeVersion::class)->find($version);
  39.                     if (!\is_null($nodeVersion)) {
  40.                         $entity $nodeVersion->getRef($this->em);
  41.                     }
  42.                 }
  43.             }
  44.             $renderContext = [
  45.                 'nodetranslation' => $nodeTranslation,
  46.                 'slug' => $url,
  47.                 'page' => $entity,
  48.                 'resource' => $entity,
  49.                 'nodemenu' => $nodeMenu,
  50.             ];
  51.             if (\is_array($parameters) || $parameters instanceof \ArrayObject) {
  52.                 $parameters array_merge($renderContext, (array) $parameters);
  53.             } else {
  54.                 $parameters $renderContext;
  55.             }
  56.             if (\is_array($response)) {
  57.                 // If the response is an array, merge with rendercontext
  58.                 $parameters array_merge($parameters$response);
  59.             }
  60.             // set the rendercontext with all params as response, plus the template in the request attribs
  61.             // the SensioFrameworkExtraBundle kernel.view will handle everything else
  62.             $event->setControllerResult((array) $parameters);
  63.             $template = new Template([]);
  64.             $template->setTemplate($entity->getDefaultView());
  65.             $controllerBits explode('::'$request->attributes->get('_controller'));
  66.             $action array_pop($controllerBits);
  67.             $template->setOwner([$controllerBits$action]);
  68.             $request->attributes->set('_template'$template);
  69.         }
  70.     }
  71. }