/**
  * @param FilterControllerEvent $event
  */
 public function onKernelController(FilterControllerEvent $event)
 {
     $request = $event->getRequest();
     // Check if the event has a nodeTranslation, if not this method can be skipped
     if (!$request->attributes->has('_nodeTranslation')) {
         return;
     }
     $nodeTranslation = $request->attributes->get('_nodeTranslation');
     if (!$nodeTranslation instanceof NodeTranslation) {
         $nodeTranslation = $this->em->getRepository('KunstmaanNodeBundle:NodeTranslation')->find($nodeTranslation);
         $request->attributes->set('_nodeTranslation', $nodeTranslation);
     }
     $entity = $nodeTranslation->getRef($this->em);
     // If the entity is an instance of the SlugActionInterface, change the controller
     if ($entity instanceof SlugActionInterface) {
         $request->attributes->set('_entity', $entity);
         // Do security check by firing an event that gets handled by the SlugSecurityListener
         $securityEvent = new SlugSecurityEvent();
         $securityEvent->setNode($nodeTranslation->getNode())->setEntity($entity)->setRequest($request)->setNodeTranslation($nodeTranslation);
         $this->eventDispatcher->dispatch(Events::SLUG_SECURITY, $securityEvent);
         // Set the right controller
         $request->attributes->set('_controller', $entity->getControllerAction());
         $event->setController($this->resolver->getController($request));
     }
 }
 /**
  * Perform basic security checks
  *
  * @param SlugSecurityEvent $event
  *
  * @throws AccessDeniedException
  * @throws NotFoundHttpException
  */
 public function onSlugSecurityEvent(SlugSecurityEvent $event)
 {
     $node = $event->getNode();
     $nodeTranslation = $event->getNodeTranslation();
     $request = $event->getRequest();
     /* @var SecurityContextInterface $securityContext */
     if (false === $this->securityContext->isGranted(PermissionMap::PERMISSION_VIEW, $node)) {
         throw new AccessDeniedException('You do not have sufficient rights to access this page.');
     }
     $isPreview = $request->attributes->get('preview');
     if (!$isPreview && !$nodeTranslation->isOnline()) {
         throw new NotFoundHttpException('The requested page is not online');
     }
 }
 /**
  * Handle the page requests
  *
  * @param Request $request The request
  * @param string  $url     The url
  * @param bool    $preview Show in preview mode
  *
  * @throws NotFoundHttpException
  * @throws AccessDeniedException
  *
  * @return Response|array
  */
 public function slugAction(Request $request, $url = null, $preview = false)
 {
     /* @var EntityManager $em */
     $em = $this->getDoctrine()->getManager();
     $locale = $request->getLocale();
     /* @var NodeTranslation $nodeTranslation */
     $nodeTranslation = $request->attributes->get('_nodeTranslation');
     // If no node translation -> 404
     if (!$nodeTranslation) {
         throw $this->createNotFoundException('No page found for slug ' . $url);
     }
     $entity = $this->getPageEntity($request, $preview, $em, $nodeTranslation);
     $node = $nodeTranslation->getNode();
     $securityEvent = new SlugSecurityEvent();
     $securityEvent->setNode($node)->setEntity($entity)->setRequest($request)->setNodeTranslation($nodeTranslation);
     $nodeMenu = $this->container->get('kunstmaan_node.node_menu');
     $nodeMenu->setLocale($locale);
     $nodeMenu->setCurrentNode($node);
     $nodeMenu->setIncludeOffline($preview);
     $eventDispatcher = $this->get('event_dispatcher');
     $eventDispatcher->dispatch(Events::SLUG_SECURITY, $securityEvent);
     //render page
     $renderContext = new RenderContext(array('nodetranslation' => $nodeTranslation, 'slug' => $url, 'page' => $entity, 'resource' => $entity, 'nodemenu' => $nodeMenu));
     if (method_exists($entity, 'getDefaultView')) {
         /** @noinspection PhpUndefinedMethodInspection */
         $renderContext->setView($entity->getDefaultView());
     }
     $preEvent = new SlugEvent(null, $renderContext);
     $eventDispatcher->dispatch(Events::PRE_SLUG_ACTION, $preEvent);
     $renderContext = $preEvent->getRenderContext();
     /** @noinspection PhpUndefinedMethodInspection */
     $response = $entity->service($this->container, $request, $renderContext);
     $postEvent = new SlugEvent($response, $renderContext);
     $eventDispatcher->dispatch(Events::POST_SLUG_ACTION, $postEvent);
     $response = $postEvent->getResponse();
     $renderContext = $postEvent->getRenderContext();
     if ($response instanceof Response) {
         return $response;
     }
     $view = $renderContext->getView();
     if (empty($view)) {
         throw $this->createNotFoundException('No page found for slug ' . $url);
     }
     $template = new Template(array());
     $template->setTemplate($view);
     $request->attributes->set('_template', $template);
     return $renderContext->getArrayCopy();
 }
 /**
  * Handle the page requests
  *
  * @param Request $request The request
  * @param string  $url     The url
  * @param bool    $preview Show in preview mode
  *
  * @throws NotFoundHttpException
  * @throws AccessDeniedException
  *
  * @return Response|array
  */
 public function slugAction(Request $request, $url = null, $preview = false)
 {
     /* @var EntityManager $em */
     $em = $this->getDoctrine()->getManager();
     $locale = $request->getLocale();
     /* @var NodeTranslation $nodeTranslation */
     $nodeTranslation = $request->get('_nodeTranslation');
     if (!$nodeTranslation) {
         // When the SlugController is used from a different Routing or RouteLoader class, the _nodeTranslation is not set, so we need this fallback
         $nodeTranslation = $em->getRepository('KunstmaanNodeBundle:NodeTranslation')->getNodeTranslationForUrl($url, $locale);
     }
     // If no node translation -> 404
     if (!$nodeTranslation) {
         throw $this->createNotFoundException('No page found for slug ' . $url);
     }
     $entity = $this->getPageEntity($request, $preview, $em, $nodeTranslation);
     $securityEvent = new SlugSecurityEvent();
     $securityEvent->setNode($nodeTranslation->getNode())->setEntity($entity)->setRequest($request)->setNodeTranslation($nodeTranslation);
     $eventDispatcher = $this->get('event_dispatcher');
     $eventDispatcher->dispatch(Events::SLUG_SECURITY, $securityEvent);
     //render page
     $renderContext = new RenderContext(array('nodetranslation' => $nodeTranslation, 'slug' => $url, 'page' => $entity, 'resource' => $entity));
     if (method_exists($entity, 'getDefaultView')) {
         /** @noinspection PhpUndefinedMethodInspection */
         $renderContext->setView($entity->getDefaultView());
     }
     $preEvent = new SlugEvent(null, $renderContext);
     $eventDispatcher->dispatch(Events::PRE_SLUG_ACTION, $preEvent);
     $renderContext = $preEvent->getRenderContext();
     /** @noinspection PhpUndefinedMethodInspection */
     $response = $entity->service($this->container, $request, $renderContext);
     $postEvent = new SlugEvent($response, $renderContext);
     $eventDispatcher->dispatch(Events::POST_SLUG_ACTION, $postEvent);
     $response = $postEvent->getResponse();
     $renderContext = $postEvent->getRenderContext();
     if ($response instanceof Response) {
         return $response;
     }
     $view = $renderContext->getView();
     if (empty($view)) {
         throw $this->createNotFoundException('No page found for slug ' . $url);
     }
     $request->attributes->set('_template', $view);
     return $renderContext->getArrayCopy();
 }
 /**
  *
  */
 public function onSlugSecurityEvent(SlugSecurityEvent $event)
 {
     $node = $event->getNode();
     $nodeTranslation = $event->getNodeTranslation();
     $request = $event->getRequest();
     /* @var SecurityContextInterface $securityContext */
     if (false === $this->securityContext->isGranted(PermissionMap::PERMISSION_VIEW, $node)) {
         throw new AccessDeniedException('You do not have sufficient rights to access this page.');
     }
     $locale = $request->attributes->get('_locale');
     $preview = $request->attributes->get('preview');
     // check if the requested node is online, else throw a 404 exception (only when not previewing!)
     if (!$preview && !$nodeTranslation->isOnline()) {
         throw new NotFoundHttpException("The requested page is not online");
     }
     $nodeMenu = new NodeMenu($this->em, $this->securityContext, $this->acl, $locale, $node, PermissionMap::PERMISSION_VIEW, $preview);
     $request->attributes->set('_nodeMenu', $nodeMenu);
 }
 /**
  * Perform basic security checks
  *
  * @param SlugSecurityEvent $event
  *
  * @throws AccessDeniedException
  * @throws NotFoundHttpException
  */
 public function onSlugSecurityEvent(SlugSecurityEvent $event)
 {
     $node = $event->getNode();
     $nodeTranslation = $event->getNodeTranslation();
     $request = $event->getRequest();
     if (false === $this->authorizationChecker->isGranted(PermissionMap::PERMISSION_VIEW, $node)) {
         throw new AccessDeniedException('You do not have sufficient rights to access this page.');
     }
     $isPreview = $request->attributes->get('preview');
     if (!$isPreview && !$nodeTranslation->isOnline()) {
         throw new NotFoundHttpException('The requested page is not online');
     }
     $nodeMenu = $this->nodeMenu;
     $nodeMenu->setLocale($nodeTranslation->getLang());
     $nodeMenu->setCurrentNode($node);
     $nodeMenu->setIncludeOffline($isPreview);
     $request->attributes->set('_nodeMenu', $nodeMenu);
 }