vendor/shopware/core/Framework/DataAbstractionLayer/FieldSerializer/AbstractFieldSerializer.php line 46

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\DataAbstractionLayer\FieldSerializer;
  3. use Shopware\Core\Defaults;
  4. use Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityTranslationDefinition;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Field\Field;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Inherited;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Required;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Write\DataStack\KeyValuePair;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Write\EntityExistence;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Write\WriteParameterBag;
  12. use Shopware\Core\Framework\Validation\WriteConstraintViolationException;
  13. use Symfony\Component\Validator\Constraint;
  14. use Symfony\Component\Validator\ConstraintViolation;
  15. use Symfony\Component\Validator\ConstraintViolationList;
  16. use Symfony\Component\Validator\Validator\ValidatorInterface;
  17. abstract class AbstractFieldSerializer implements FieldSerializerInterface
  18. {
  19.     /**
  20.      * @var ValidatorInterface
  21.      */
  22.     protected $validator;
  23.     /**
  24.      * @var DefinitionInstanceRegistry
  25.      */
  26.     protected $definitionRegistry;
  27.     public function __construct(ValidatorInterface $validatorDefinitionInstanceRegistry $definitionRegistry)
  28.     {
  29.         $this->validator $validator;
  30.         $this->definitionRegistry $definitionRegistry;
  31.     }
  32.     protected function validate(
  33.         array $constraints,
  34.         KeyValuePair $data,
  35.         string $path
  36.     ): void {
  37.         $violationList = new ConstraintViolationList();
  38.         foreach ($constraints as $constraint) {
  39.             $violations $this->validator->validate($data->getValue(), $constraint);
  40.             /** @var ConstraintViolation $violation */
  41.             foreach ($violations as $violation) {
  42.                 $fieldName $data->getKey();
  43.                 // correct pointer for json fields with pre-defined structure
  44.                 if ($violation->getPropertyPath()) {
  45.                     $property str_replace('][''/'$violation->getPropertyPath());
  46.                     $property trim($property'][');
  47.                     $fieldName .= '/' $property;
  48.                 }
  49.                 $fieldName '/' $fieldName;
  50.                 $violationList->add(
  51.                     new ConstraintViolation(
  52.                         $violation->getMessage(),
  53.                         $violation->getMessageTemplate(),
  54.                         $violation->getParameters(),
  55.                         $violation->getRoot(),
  56.                         $fieldName,
  57.                         $violation->getInvalidValue(),
  58.                         $violation->getPlural(),
  59.                         $violation->getCode(),
  60.                         $violation->getConstraint(),
  61.                         $violation->getCause()
  62.                     )
  63.                 );
  64.             }
  65.         }
  66.         if (\count($violationList)) {
  67.             throw new WriteConstraintViolationException($violationList$path);
  68.         }
  69.     }
  70.     protected function requiresValidation(
  71.         Field $field,
  72.         EntityExistence $existence,
  73.         $value,
  74.         WriteParameterBag $parameters
  75.     ): bool {
  76.         if ($value !== null) {
  77.             return true;
  78.         }
  79.         if ($existence->isChild() && $this->isInherited($field$parameters)) {
  80.             return false;
  81.         }
  82.         if ($existence->hasEntityName()
  83.             && $this->definitionRegistry->getByEntityName($existence->getEntityName()) instanceof EntityTranslationDefinition
  84.             && $parameters->getCurrentWriteLanguageId() !== Defaults::LANGUAGE_SYSTEM
  85.         ) {
  86.             return false;
  87.         }
  88.         return $field->is(Required::class);
  89.     }
  90.     protected function isInherited(Field $fieldWriteParameterBag $parameters): bool
  91.     {
  92.         if ($parameters->getDefinition()->isInheritanceAware()) {
  93.             return $field->is(Inherited::class);
  94.         }
  95.         if (!$parameters->getDefinition() instanceof EntityTranslationDefinition) {
  96.             return false;
  97.         }
  98.         $parent $parameters->getDefinition()->getParentDefinition();
  99.         $field $parent->getFields()->get($field->getPropertyName());
  100.         return $field->is(Inherited::class);
  101.     }
  102.     protected function validateIfNeeded(Field $fieldEntityExistence $existenceKeyValuePair $dataWriteParameterBag $parameters): void
  103.     {
  104.         if (!$this->requiresValidation($field$existence$data->getValue(), $parameters)) {
  105.             return;
  106.         }
  107.         $constraints $this->getConstraints($field);
  108.         $this->validate($constraints$data$parameters->getPath());
  109.     }
  110.     /**
  111.      * @return Constraint[]
  112.      */
  113.     protected function getConstraints(Field $field): array
  114.     {
  115.         return [];
  116.     }
  117. }