vendor/ibexa/core/src/bundle/Core/Fragment/DirectFragmentRenderer.php line 26

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Bundle\Core\Fragment;
  8. use Ibexa\Bundle\Core\EventListener\ViewControllerListener;
  9. use Ibexa\Core\MVC\Symfony\Templating\Exception\InvalidResponseException;
  10. use Ibexa\Core\MVC\Symfony\View\Renderer\TemplateRenderer;
  11. use Ibexa\Core\MVC\Symfony\View\View;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
  15. use Symfony\Component\HttpKernel\Controller\ControllerReference;
  16. use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
  17. use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface;
  18. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  19. use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;
  20. use Symfony\Component\HttpKernel\HttpKernelInterface;
  21. use Symfony\Component\HttpKernel\KernelInterface;
  22. class DirectFragmentRenderer extends InlineFragmentRenderer implements FragmentRendererInterface
  23. {
  24.     public const NAME 'direct';
  25.     /** @var \Symfony\Component\HttpKernel\KernelInterface */
  26.     protected $kernel;
  27.     /** @var \Ibexa\Bundle\Core\EventListener\ViewControllerListener */
  28.     protected $controllerListener;
  29.     /** @var \Symfony\Component\HttpKernel\Controller\ControllerResolverInterface */
  30.     protected $controllerResolver;
  31.     /** @var \Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface */
  32.     protected $argumentMetadataFactory;
  33.     /** @var \Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface */
  34.     protected $argumentValueResolver;
  35.     /** @var \Ibexa\Core\MVC\Symfony\View\Renderer\TemplateRenderer */
  36.     protected $viewTemplateRenderer;
  37.     public function __construct(
  38.         KernelInterface $kernel,
  39.         ViewControllerListener $controllerListener,
  40.         ControllerResolverInterface $controllerResolver,
  41.         ArgumentMetadataFactoryInterface $argumentMetadataFactory,
  42.         ArgumentValueResolverInterface $argumentValueResolver,
  43.         TemplateRenderer $viewTemplateRenderer
  44.     ) {
  45.         $this->kernel $kernel;
  46.         $this->controllerListener $controllerListener;
  47.         $this->controllerResolver $controllerResolver;
  48.         $this->argumentMetadataFactory $argumentMetadataFactory;
  49.         $this->argumentValueResolver $argumentValueResolver;
  50.         $this->viewTemplateRenderer $viewTemplateRenderer;
  51.     }
  52.     protected function getControllerEvent(Request $request): ControllerEvent
  53.     {
  54.         $controller $this->controllerResolver->getController($request);
  55.         $this->controllerListener->getController(
  56.             $event = new ControllerEvent(
  57.                 $this->kernel,
  58.                 $controller,
  59.                 $request,
  60.                 HttpKernelInterface::SUB_REQUEST
  61.             )
  62.         );
  63.         return $event;
  64.     }
  65.     protected function getController(ControllerEvent $event): callable
  66.     {
  67.         return $this->controllerResolver->getController($event->getRequest());
  68.     }
  69.     protected function getArguments(callable $controllerControllerEvent $event): array
  70.     {
  71.         $argumentsMetadata $this->argumentMetadataFactory->createArgumentMetadata($controller);
  72.         $arguments = [];
  73.         foreach ($argumentsMetadata as $argumentMetadata) {
  74.             // Single-value generator
  75.             $valueGenerator $this->argumentValueResolver->resolve($event->getRequest(), $argumentMetadata);
  76.             foreach ($valueGenerator as $value) {
  77.                 $arguments[$argumentMetadata->getName()] = $value;
  78.                 break;
  79.             }
  80.         }
  81.         return $arguments;
  82.     }
  83.     protected function getFragmentUri(
  84.         ControllerReference $reference,
  85.         Request $request
  86.     ): string {
  87.         $simplifiedReference = clone $reference;
  88.         $simplifiedReference->attributes = [
  89.             '_format' => $reference->attributes['_format'] ?? null,
  90.             '_locale' => $reference->attributes['_locale'] ?? null,
  91.         ];
  92.         return $this->generateFragmentUri($simplifiedReference$requestfalsefalse);
  93.     }
  94.     /**
  95.      * @param string|\Symfony\Component\HttpKernel\Controller\ControllerReference $uri
  96.      *
  97.      * @throws \Ibexa\Core\MVC\Symfony\Templating\Exception\InvalidResponseException
  98.      */
  99.     public function render(
  100.         $uri,
  101.         Request $request,
  102.         array $options = []
  103.     ): Response {
  104.         $controllerReference null;
  105.         if ($uri instanceof ControllerReference) {
  106.             $controllerReference $uri;
  107.             $uri $this->getFragmentUri($controllerReference$request);
  108.         }
  109.         $subRequest $this->createSubRequest($uri$request);
  110.         $subRequest->attributes->set('siteaccess'$request->attributes->get('siteaccess'));
  111.         if (null !== $controllerReference) {
  112.             $subRequest->attributes->add($controllerReference->attributes);
  113.             $subRequest->attributes->set('_controller'$controllerReference->controller);
  114.         }
  115.         $event $this->getControllerEvent($subRequest);
  116.         $controller $this->getController($event);
  117.         $arguments $this->getArguments($controller$event);
  118.         $response $controller(...array_values($arguments));
  119.         if ($response instanceof Response) {
  120.             return $response;
  121.         } elseif ($response instanceof View) {
  122.             return new Response($this->viewTemplateRenderer->render($response));
  123.         } elseif (is_string($response)) {
  124.             return new Response($response);
  125.         }
  126.         throw new InvalidResponseException(
  127.             sprintf('Unsupported type (%s)'is_object($response) ? get_class($response) : gettype($response))
  128.         );
  129.     }
  130.     public function getName(): string
  131.     {
  132.         return self::NAME;
  133.     }
  134. }
  135. class_alias(DirectFragmentRenderer::class, 'eZ\Bundle\EzPublishCoreBundle\Fragment\DirectFragmentRenderer');