src/App/Component/ViewLayer/ViewHandlers/WebViewHandler.php line 71

Open in your IDE?
  1. <?php
  2. namespace App\Component\ViewLayer\ViewHandlers;
  3. use App\Component\ViewLayer\AbstractView;
  4. use App\Component\ViewLayer\AbstractViewHandler;
  5. use App\Component\ViewLayer\Views\AbstractWebView;
  6. use Cms\FrontendBundle\Service\FrontendBuilder;
  7. use Cms\Widgets\Html\Html;
  8. use Twig\Environment;
  9. /**
  10.  *
  11.  */
  12. final class WebViewHandler extends AbstractViewHandler
  13. {
  14.     // DI
  15.     protected Environment $twig;
  16.     protected FrontendBuilder $builder;
  17.     /**
  18.      * @param Environment $twig
  19.      * @param FrontendBuilder $builder
  20.      */
  21.     public function __construct(
  22.         Environment $twig,
  23.         FrontendBuilder $builder
  24.     )
  25.     {
  26.         $this->twig $twig;
  27.         $this->builder $builder;
  28.     }
  29.     /**
  30.      * {@inheritDoc}
  31.      */
  32.     public function supports(AbstractView $view): bool
  33.     {
  34.         return ($view instanceof AbstractWebView);
  35.     }
  36.     /**
  37.      * {@inheritDoc}
  38.      * @param AbstractWebView $view
  39.      */
  40.     public function prepare(AbstractView $view): void
  41.     {
  42.         // see if we don't have a template given; if not generate a default one
  43.         if (empty($view->getTemplate())) {
  44.             // get the routing information
  45.             $route $view->getRequest()->attributes->get('_route');
  46.             // get the parts that make up the route; currently ignoring the first two
  47.             // TODO: need to make this a bit more flexible as the naming convention might not be consistent?
  48.             $paths array_slice(explode('.'$route), 3, -1);
  49.             // set the template path
  50.             $view->setTemplate(sprintf(
  51.                 '@package$/controllers/%s.html.twig',
  52.                 implode('/'$paths)
  53.             ));
  54.         }
  55.     }
  56.     /**
  57.      * {@inheritDoc}
  58.      * @param AbstractWebView $view
  59.      */
  60.     public function handle(AbstractView $view): string
  61.     {
  62.         // render the main content area and set it into the dom
  63.         $content $this->twig->render(
  64.             $view->getTemplate(),
  65.             array_merge(
  66.                 $view->getParameters(),
  67.                 []
  68.             )
  69.         );
  70.         // render the full page
  71.         return $this->builder->renderCustom(
  72.             $view->getRenderContext()->toFrontendGlobals(),
  73.             [(new Html())->setContent($content)]
  74.         );
  75.     }
  76. }