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

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\NodeBundle\EventListener;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\Event\ViewEvent;
  9. use Symfony\Component\Templating\EngineInterface;
  10. class RenderContextListener
  11. {
  12.     /**
  13.      * @var EngineInterface
  14.      */
  15.     protected $templating;
  16.     /**
  17.      * @var EntityManagerInterface
  18.      */
  19.     protected $em;
  20.     /**
  21.      * @param EngineInterface        $templating
  22.      * @param EntityManagerInterface $em
  23.      */
  24.     public function __construct(/* EngineInterface|EntityManagerInterface */ $emEntityManagerInterface $emOld null)
  25.     {
  26.         if ($em instanceof EngineInterface) {
  27.             // NEXT_MAJOR Also remove the symfony/templating dependency as it is unused after the removal of the templating parameter.
  28.             @trigger_error(sprintf('Passing a templating engine as the first argument of "%s" is deprecated since KunstmaanNodeBundle 5.1 and will be removed in KunstmaanNodeBundle 6.0. Remove the template engine service argument.'__METHOD__), E_USER_DEPRECATED);
  29.             $this->templating $em;
  30.             $this->em $emOld;
  31.             return;
  32.         }
  33.         $this->em $em;
  34.     }
  35.     /**
  36.      * @param GetResponseForControllerResultEvent|ViewEvent $event
  37.      */
  38.     public function onKernelView($event)
  39.     {
  40.         if (!$event instanceof GetResponseForControllerResultEvent && !$event instanceof ViewEvent) {
  41.             throw new \InvalidArgumentException(\sprintf('Expected instance of type %s, %s given', \class_exists(RequestEvent::class) ? ViewEvent::class : GetResponseForControllerResultEvent::class, \is_object($event) ? \get_class($event) : \gettype($event)));
  42.         }
  43.         $response $event->getControllerResult();
  44.         if ($response instanceof Response) {
  45.             // If it's a response, just continue
  46.             return;
  47.         }
  48.         $request $event->getRequest();
  49.         if ($request->attributes->has('_template')) { //template is already set
  50.             return;
  51.         }
  52.         $nodeTranslation $request->attributes->get('_nodeTranslation');
  53.         if ($nodeTranslation) {
  54.             $entity $request->attributes->get('_entity');
  55.             $url $request->attributes->get('url');
  56.             $nodeMenu $request->attributes->get('_nodeMenu');
  57.             $parameters $request->attributes->get('_renderContext');
  58.             if ($request->get('preview') === true) {
  59.                 $version $request->get('version');
  60.                 if (!empty($version) && is_numeric($version)) {
  61.                     $nodeVersion $this->em->getRepository('KunstmaanNodeBundle:NodeVersion')->find($version);
  62.                     if (!\is_null($nodeVersion)) {
  63.                         $entity $nodeVersion->getRef($this->em);
  64.                     }
  65.                 }
  66.             }
  67.             $renderContext = array(
  68.                 'nodetranslation' => $nodeTranslation,
  69.                 'slug' => $url,
  70.                 'page' => $entity,
  71.                 'resource' => $entity,
  72.                 'nodemenu' => $nodeMenu,
  73.             );
  74.             if (\is_array($parameters) || $parameters instanceof \ArrayObject) {
  75.                 $parameters array_merge($renderContext, (array) $parameters);
  76.             } else {
  77.                 $parameters $renderContext;
  78.             }
  79.             if (\is_array($response)) {
  80.                 // If the response is an array, merge with rendercontext
  81.                 $parameters array_merge($parameters$response);
  82.             }
  83.             //set the rendercontext with all params as response, plus the template in the request attribs
  84.             //the SensioFrameworkExtraBundle kernel.view will handle everything else
  85.             $event->setControllerResult((array) $parameters);
  86.             $template = new Template(array());
  87.             $template->setTemplate($entity->getDefaultView());
  88.             $controllerInfo $this->getControllerInfo($request->attributes->get('_controller'));
  89.             $template->setOwner($controllerInfo);
  90.             $request->attributes->set('_template'$template);
  91.         }
  92.     }
  93.     /**
  94.      * BC check to return correct controller/action information.
  95.      *
  96.      * @param string $controllerString
  97.      *
  98.      * @return array
  99.      */
  100.     private function getControllerInfo($controllerString)
  101.     {
  102.         if (strpos($controllerString'::') !== false) {
  103.             $controllerBits explode('::'$controllerString);
  104.             $action array_pop($controllerBits);
  105.             return [$controllerBits$action];
  106.         }
  107.         // NEXT_MAJOR: Remove BC check when we drop sf 3.4 support
  108.         $controllerBits explode(':'$controllerString);
  109.         $action array_pop($controllerBits);
  110.         return [implode(':'$controllerBits), $action];
  111.     }
  112. }