vendor/shopware/core/Framework/Validation/DataValidator.php line 54

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Validation;
  3. use Shopware\Core\Framework\Log\Package;
  4. use Shopware\Core\Framework\Validation\Exception\ConstraintViolationException;
  5. use Symfony\Component\Validator\ConstraintViolation;
  6. use Symfony\Component\Validator\ConstraintViolationList;
  7. use Symfony\Component\Validator\Validator\ValidatorInterface;
  8. #[Package('core')]
  9. class DataValidator
  10. {
  11.     /**
  12.      * @var ValidatorInterface
  13.      */
  14.     private $validator;
  15.     /**
  16.      * @internal
  17.      */
  18.     public function __construct(ValidatorInterface $validator)
  19.     {
  20.         $this->validator $validator;
  21.     }
  22.     public function getViolations(array $dataDataValidationDefinition $definitionstring $path ''): ConstraintViolationList
  23.     {
  24.         $violations = new ConstraintViolationList();
  25.         $violations->addAll($this->validateProperties($data$definition$path));
  26.         $violations->addAll($this->validateSubDefinitions($data$definition$path));
  27.         $violations->addAll($this->validateListDefinitions($data$definition$path));
  28.         return $violations;
  29.     }
  30.     public function validate(array $dataDataValidationDefinition $definitionstring $path ''): void
  31.     {
  32.         $violations $this->getViolations($data$definition$path);
  33.         if ($violations->count() === 0) {
  34.             return;
  35.         }
  36.         throw new ConstraintViolationException($violations$data);
  37.     }
  38.     private function validateProperties(array $dataDataValidationDefinition $definitionstring $path): ConstraintViolationList
  39.     {
  40.         $constraintViolations = new ConstraintViolationList();
  41.         foreach ($definition->getProperties() as $propertyName => $constraints) {
  42.             $value $data[$propertyName] ?? null;
  43.             $violations $this->validator->validate($value$constraints);
  44.             /** @var ConstraintViolation $violation */
  45.             foreach ($violations as $violation) {
  46.                 $constraintViolations->add(
  47.                     new ConstraintViolation(
  48.                         $violation->getMessage(),
  49.                         $violation->getMessageTemplate(),
  50.                         $violation->getParameters(),
  51.                         $violation->getRoot(),
  52.                         $path '/' $propertyName,
  53.                         $violation->getInvalidValue(),
  54.                         $violation->getPlural(),
  55.                         $violation->getCode(),
  56.                         $violation->getConstraint(),
  57.                         $violation->getCause()
  58.                     )
  59.                 );
  60.             }
  61.         }
  62.         return $constraintViolations;
  63.     }
  64.     private function validateSubDefinitions(array $dataDataValidationDefinition $definitionstring $path): ConstraintViolationList
  65.     {
  66.         $constraintViolations = new ConstraintViolationList();
  67.         foreach ($definition->getSubDefinitions() as $propertyName => $subDefinition) {
  68.             $value $data[$propertyName] ?? [];
  69.             $constraintViolations->addAll(
  70.                 $this->getViolations($value$subDefinition$path '/' $propertyName)
  71.             );
  72.         }
  73.         return $constraintViolations;
  74.     }
  75.     private function validateListDefinitions(array $dataDataValidationDefinition $definitionstring $path): ConstraintViolationList
  76.     {
  77.         $constraintViolations = new ConstraintViolationList();
  78.         foreach ($definition->getListDefinitions() as $propertyName => $subDefinition) {
  79.             $values $data[$propertyName] ?? [];
  80.             $i 0;
  81.             foreach ($values as $item) {
  82.                 $constraintViolations->addAll(
  83.                     $this->getViolations($item$subDefinition$path '/' $propertyName '/' $i)
  84.                 );
  85.                 ++$i;
  86.             }
  87.         }
  88.         return $constraintViolations;
  89.     }
  90. }