vendor/symfony/twig-bridge/EventListener/TemplateAttributeListener.php line 31

  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Bridge\Twig\EventListener;
  11. use Symfony\Bridge\Twig\Attribute\Template;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\Form\FormInterface;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\StreamedResponse;
  16. use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
  17. use Symfony\Component\HttpKernel\Event\ViewEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Twig\Environment;
  20. class TemplateAttributeListener implements EventSubscriberInterface
  21. {
  22.     public function __construct(
  23.         private Environment $twig,
  24.     ) {
  25.     }
  26.     public function onKernelView(ViewEvent $event)
  27.     {
  28.         $parameters $event->getControllerResult();
  29.         if (!\is_array($parameters ?? [])) {
  30.             return;
  31.         }
  32.         $attribute $event->getRequest()->attributes->get('_template');
  33.         if (!$attribute instanceof Template && !$attribute $event->controllerArgumentsEvent?->getAttributes()[Template::class][0] ?? null) {
  34.             return;
  35.         }
  36.         $parameters ??= $this->resolveParameters($event->controllerArgumentsEvent$attribute->vars);
  37.         $status 200;
  38.         foreach ($parameters as $k => $v) {
  39.             if (!$v instanceof FormInterface) {
  40.                 continue;
  41.             }
  42.             if ($v->isSubmitted() && !$v->isValid()) {
  43.                 $status 422;
  44.             }
  45.             $parameters[$k] = $v->createView();
  46.         }
  47.         $event->setResponse($attribute->stream
  48.             ? new StreamedResponse(fn () => $this->twig->display($attribute->template$parameters), $status)
  49.             : new Response($this->twig->render($attribute->template$parameters), $status)
  50.         );
  51.     }
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [
  55.             KernelEvents::VIEW => ['onKernelView', -128],
  56.         ];
  57.     }
  58.     private function resolveParameters(ControllerArgumentsEvent $event, ?array $vars): array
  59.     {
  60.         if ([] === $vars) {
  61.             return [];
  62.         }
  63.         $parameters $event->getNamedArguments();
  64.         if (null !== $vars) {
  65.             $parameters array_intersect_key($parametersarray_flip($vars));
  66.         }
  67.         return $parameters;
  68.     }
  69. }