vendor/api-platform/core/src/Symfony/EventListener/ValidateListener.php line 47

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the API Platform project.
  4.  *
  5.  * (c) Kévin Dunglas <dunglas@gmail.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. declare(strict_types=1);
  11. namespace ApiPlatform\Symfony\EventListener;
  12. use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
  13. use ApiPlatform\Core\Metadata\Resource\ToggleableOperationAttributeTrait;
  14. use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
  15. use ApiPlatform\Util\OperationRequestInitiatorTrait;
  16. use ApiPlatform\Util\RequestAttributesExtractor;
  17. use ApiPlatform\Validator\Exception\ValidationException;
  18. use ApiPlatform\Validator\ValidatorInterface;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\HttpKernel\Event\ViewEvent;
  21. /**
  22.  * Validates data.
  23.  *
  24.  * @author Kévin Dunglas <dunglas@gmail.com>
  25.  */
  26. final class ValidateListener
  27. {
  28.     use OperationRequestInitiatorTrait;
  29.     use ToggleableOperationAttributeTrait;
  30.     public const OPERATION_ATTRIBUTE_KEY 'validate';
  31.     private $validator;
  32.     private $resourceMetadataFactory;
  33.     public function __construct(ValidatorInterface $validator$resourceMetadataFactory)
  34.     {
  35.         $this->validator $validator;
  36.         $this->resourceMetadataFactory $resourceMetadataFactory;
  37.         if (!$resourceMetadataFactory instanceof ResourceMetadataCollectionFactoryInterface) {
  38.             trigger_deprecation('api-platform/core''2.7'sprintf('Use "%s" instead of "%s".'ResourceMetadataCollectionFactoryInterface::class, ResourceMetadataFactoryInterface::class));
  39.         } else {
  40.             $this->resourceMetadataCollectionFactory $resourceMetadataFactory;
  41.         }
  42.     }
  43.     /**
  44.      * Validates data returned by the controller if applicable.
  45.      *
  46.      * @throws ValidationException
  47.      */
  48.     public function onKernelView(ViewEvent $event): void
  49.     {
  50.         $controllerResult $event->getControllerResult();
  51.         $request $event->getRequest();
  52.         $operation $this->initializeOperation($request);
  53.         if (
  54.             $controllerResult instanceof Response
  55.             || $request->isMethodSafe()
  56.             || $request->isMethod('DELETE')
  57.             || !($attributes RequestAttributesExtractor::extractAttributes($request))
  58.         ) {
  59.             return;
  60.         }
  61.         if ($this->resourceMetadataFactory instanceof ResourceMetadataCollectionFactoryInterface &&
  62.             (!$operation || !($operation->canValidate() ?? true))
  63.         ) {
  64.             return;
  65.         }
  66.         // TODO: 3.0 remove condition
  67.         if (
  68.             $this->resourceMetadataFactory instanceof ResourceMetadataFactoryInterface && (
  69.                 !$attributes['receive']
  70.                 || $this->isOperationAttributeDisabled($attributesself::OPERATION_ATTRIBUTE_KEY)
  71.             )
  72.         ) {
  73.             return;
  74.         }
  75.         $validationContext $operation ? ($operation->getValidationContext() ?? []) : [];
  76.         if (!$validationContext && $this->resourceMetadataFactory instanceof ResourceMetadataFactoryInterface) {
  77.             $resourceMetadata $this->resourceMetadataFactory->create($attributes['resource_class']);
  78.             $validationGroups $resourceMetadata->getOperationAttribute($attributes'validation_groups'nulltrue);
  79.             $validationContext = ['groups' => $validationGroups];
  80.         }
  81.         $this->validator->validate($controllerResult$validationContext);
  82.     }
  83. }
  84. class_alias(ValidateListener::class, \ApiPlatform\Core\Validator\EventListener\ValidateListener::class);