vendor/kunstmaan/node-bundle/Controller/SlugController.php line 72

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\NodeBundle\Controller;
  3. use Doctrine\ORM\EntityManager;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Kunstmaan\NodeBundle\Entity\HasNodeInterface;
  6. use Kunstmaan\NodeBundle\Entity\NodeTranslation;
  7. use Kunstmaan\NodeBundle\Event\Events;
  8. use Kunstmaan\NodeBundle\Event\SlugEvent;
  9. use Kunstmaan\NodeBundle\Event\SlugSecurityEvent;
  10. use Kunstmaan\NodeBundle\Helper\RenderContext;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  12. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  17. /**
  18.  * This controller is for showing frontend pages based on slugs
  19.  */
  20. class SlugController extends Controller
  21. {
  22.     /**
  23.      * Handle the page requests
  24.      *
  25.      * @param Request $request The request
  26.      * @param string  $url     The url
  27.      * @param bool    $preview Show in preview mode
  28.      *
  29.      * @throws NotFoundHttpException
  30.      * @throws AccessDeniedException
  31.      *
  32.      * @return Response|array
  33.      */
  34.     public function slugAction(Request $request$url null$preview false)
  35.     {
  36.         /* @var EntityManager $em */
  37.         $em $this->getDoctrine()->getManager();
  38.         $locale $request->getLocale();
  39.         /* @var NodeTranslation $nodeTranslation */
  40.         $nodeTranslation $request->attributes->get('_nodeTranslation');
  41.         // If no node translation -> 404
  42.         if (!$nodeTranslation) {
  43.             throw $this->createNotFoundException('No page found for slug ' $url);
  44.         }
  45.         $entity $this->getPageEntity(
  46.             $request,
  47.             $preview,
  48.             $em,
  49.             $nodeTranslation
  50.         );
  51.         $node $nodeTranslation->getNode();
  52.         $securityEvent = new SlugSecurityEvent();
  53.         $securityEvent
  54.             ->setNode($node)
  55.             ->setEntity($entity)
  56.             ->setRequest($request)
  57.             ->setNodeTranslation($nodeTranslation);
  58.         $nodeMenu $this->container->get('kunstmaan_node.node_menu');
  59.         $nodeMenu->setLocale($locale);
  60.         $nodeMenu->setCurrentNode($node);
  61.         $nodeMenu->setIncludeOffline($preview);
  62.         $eventDispatcher $this->get('event_dispatcher');
  63.         $eventDispatcher->dispatch(Events::SLUG_SECURITY$securityEvent);
  64.         //render page
  65.         $renderContext = new RenderContext(
  66.             array(
  67.                 'nodetranslation' => $nodeTranslation,
  68.                 'slug' => $url,
  69.                 'page' => $entity,
  70.                 'resource' => $entity,
  71.                 'nodemenu' => $nodeMenu,
  72.             )
  73.         );
  74.         if (method_exists($entity'getDefaultView')) {
  75.             $renderContext->setView($entity->getDefaultView());
  76.         }
  77.         $preEvent = new SlugEvent(null$renderContext);
  78.         $eventDispatcher->dispatch(Events::PRE_SLUG_ACTION$preEvent);
  79.         $renderContext $preEvent->getRenderContext();
  80.         $response $entity->service($this->container$request$renderContext);
  81.         $postEvent = new SlugEvent($response$renderContext);
  82.         $eventDispatcher->dispatch(Events::POST_SLUG_ACTION$postEvent);
  83.         $response $postEvent->getResponse();
  84.         $renderContext $postEvent->getRenderContext();
  85.         if ($response instanceof Response) {
  86.             return $response;
  87.         }
  88.         $view $renderContext->getView();
  89.         if (empty($view)) {
  90.             throw $this->createNotFoundException(sprintf('Missing view path for page "%s"', \get_class($entity)));
  91.         }
  92.         $template = new Template(array());
  93.         $template->setTemplate($view);
  94.         $template->setOwner([SlugController::class, 'slugAction']);
  95.         $request->attributes->set('_template'$template);
  96.         return $renderContext->getArrayCopy();
  97.     }
  98.     /**
  99.      * @param Request                $request
  100.      * @param bool                   $preview
  101.      * @param EntityManagerInterface $em
  102.      * @param NodeTranslation        $nodeTranslation
  103.      *
  104.      * @return \Kunstmaan\NodeBundle\Entity\HasNodeInterface
  105.      */
  106.     private function getPageEntity(Request $request$previewEntityManagerInterface $emNodeTranslation $nodeTranslation)
  107.     {
  108.         /* @var HasNodeInterface $entity */
  109.         $entity null;
  110.         if ($preview) {
  111.             $version $request->get('version');
  112.             if (!empty($version) && is_numeric($version)) {
  113.                 $nodeVersion $em->getRepository('KunstmaanNodeBundle:NodeVersion')->find($version);
  114.                 if (!\is_null($nodeVersion)) {
  115.                     $entity $nodeVersion->getRef($em);
  116.                 }
  117.             }
  118.         }
  119.         if (\is_null($entity)) {
  120.             $entity $nodeTranslation->getPublicNodeVersion()->getRef($em);
  121.             return $entity;
  122.         }
  123.         return $entity;
  124.     }
  125. }