vendor/pimcore/pimcore/bundles/CoreBundle/EventListener/ControllerViewModelListener.php line 57

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace Pimcore\Bundle\CoreBundle\EventListener;
  15. use Pimcore\Http\Request\Resolver\ViewModelResolver;
  16. use Pimcore\Templating\Model\ViewModelInterface;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. class ControllerViewModelListener implements EventSubscriberInterface
  21. {
  22.     /**
  23.      * @var ViewModelResolver
  24.      */
  25.     protected $viewModelResolver;
  26.     /**
  27.      * @param ViewModelResolver $viewModelResolver
  28.      */
  29.     public function __construct(ViewModelResolver $viewModelResolver)
  30.     {
  31.         $this->viewModelResolver $viewModelResolver;
  32.     }
  33.     /**
  34.      * @inheritDoc
  35.      */
  36.     public static function getSubscribedEvents()
  37.     {
  38.         return [
  39.             // set a higher priority to make this run before the @Template annotation
  40.             // handler kicks in (SensioFrameworkExtraBundle) to make sure the ViewModel
  41.             // is processed before template is rendered
  42.             KernelEvents::VIEW => ['onKernelView'10]
  43.         ];
  44.     }
  45.     /**
  46.      * When action uses the Template annotation, add ViewModel variables to the controller result
  47.      * before proceeding to render the template.
  48.      *
  49.      * @param GetResponseForControllerResultEvent $event
  50.      */
  51.     public function onKernelView(GetResponseForControllerResultEvent $event)
  52.     {
  53.         $request $event->getRequest();
  54.         // only alter requests with a @Template annotation
  55.         $template $request->attributes->get('_template');
  56.         if (null === $template) {
  57.             return;
  58.         }
  59.         $result $event->getControllerResult();
  60.         // controller returned a ViewModel instance -> transform the model to array and return
  61.         if ($result instanceof ViewModelInterface) {
  62.             $event->setControllerResult($result->getParameters()->all());
  63.             return;
  64.         }
  65.         // view model is empty -> nothing to do
  66.         $view $this->viewModelResolver->getViewModel($event->getRequest());
  67.         if (null === $view || $view->count() === 0) {
  68.             return;
  69.         }
  70.         if (null === $result) {
  71.             // empty result -> add view model params
  72.             $event->setControllerResult($view->getParameters()->all());
  73.         } else {
  74.             // add missing view model params to result
  75.             if (is_array($result)) {
  76.                 $result array_replace($view->getParameters()->all(), $result);
  77.                 $event->setControllerResult($result);
  78.             }
  79.         }
  80.     }
  81. }