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

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