vendor/symfony/form/Extension/HttpFoundation/HttpFoundationRequestHandler.php line 38

  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\Component\Form\Extension\HttpFoundation;
  11. use Symfony\Component\Form\Exception\UnexpectedTypeException;
  12. use Symfony\Component\Form\FormError;
  13. use Symfony\Component\Form\FormInterface;
  14. use Symfony\Component\Form\RequestHandlerInterface;
  15. use Symfony\Component\Form\Util\ServerParams;
  16. use Symfony\Component\HttpFoundation\File\File;
  17. use Symfony\Component\HttpFoundation\File\UploadedFile;
  18. use Symfony\Component\HttpFoundation\Request;
  19. /**
  20.  * A request processor using the {@link Request} class of the HttpFoundation
  21.  * component.
  22.  *
  23.  * @author Bernhard Schussek <bschussek@gmail.com>
  24.  */
  25. class HttpFoundationRequestHandler implements RequestHandlerInterface
  26. {
  27.     private ServerParams $serverParams;
  28.     public function __construct(ServerParams $serverParams null)
  29.     {
  30.         $this->serverParams $serverParams ?? new ServerParams();
  31.     }
  32.     public function handleRequest(FormInterface $formmixed $request null)
  33.     {
  34.         if (!$request instanceof Request) {
  35.             throw new UnexpectedTypeException($requestRequest::class);
  36.         }
  37.         $name $form->getName();
  38.         $method $form->getConfig()->getMethod();
  39.         if ($method !== $request->getMethod()) {
  40.             return;
  41.         }
  42.         // For request methods that must not have a request body we fetch data
  43.         // from the query string. Otherwise we look for data in the request body.
  44.         if ('GET' === $method || 'HEAD' === $method || 'TRACE' === $method) {
  45.             if ('' === $name) {
  46.                 $data $request->query->all();
  47.             } else {
  48.                 // Don't submit GET requests if the form's name does not exist
  49.                 // in the request
  50.                 if (!$request->query->has($name)) {
  51.                     return;
  52.                 }
  53.                 $data $request->query->all()[$name];
  54.             }
  55.         } else {
  56.             // Mark the form with an error if the uploaded size was too large
  57.             // This is done here and not in FormValidator because $_POST is
  58.             // empty when that error occurs. Hence the form is never submitted.
  59.             if ($this->serverParams->hasPostMaxSizeBeenExceeded()) {
  60.                 // Submit the form, but don't clear the default values
  61.                 $form->submit(nullfalse);
  62.                 $form->addError(new FormError(
  63.                     $form->getConfig()->getOption('upload_max_size_message')(),
  64.                     null,
  65.                     ['{{ max }}' => $this->serverParams->getNormalizedIniPostMaxSize()]
  66.                 ));
  67.                 return;
  68.             }
  69.             if ('' === $name) {
  70.                 $params $request->request->all();
  71.                 $files $request->files->all();
  72.             } elseif ($request->request->has($name) || $request->files->has($name)) {
  73.                 $default $form->getConfig()->getCompound() ? [] : null;
  74.                 $params $request->request->all()[$name] ?? $default;
  75.                 $files $request->files->get($name$default);
  76.             } else {
  77.                 // Don't submit the form if it is not present in the request
  78.                 return;
  79.             }
  80.             if (\is_array($params) && \is_array($files)) {
  81.                 $data array_replace_recursive($params$files);
  82.             } else {
  83.                 $data $params ?: $files;
  84.             }
  85.         }
  86.         // Don't auto-submit the form unless at least one field is present.
  87.         if ('' === $name && \count(array_intersect_key($data$form->all())) <= 0) {
  88.             return;
  89.         }
  90.         $form->submit($data'PATCH' !== $method);
  91.     }
  92.     public function isFileUpload(mixed $data): bool
  93.     {
  94.         return $data instanceof File;
  95.     }
  96.     public function getUploadFileError(mixed $data): ?int
  97.     {
  98.         if (!$data instanceof UploadedFile || $data->isValid()) {
  99.             return null;
  100.         }
  101.         return $data->getError();
  102.     }
  103. }