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

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\AllowHtml;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Inherited;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\Required;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Write\DataStack\KeyValuePair;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Write\EntityExistence;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Write\WriteParameterBag;
  13. use Shopware\Core\Framework\Util\HtmlSanitizer;
  14. use Shopware\Core\Framework\Validation\WriteConstraintViolationException;
  15. use Symfony\Component\Validator\Constraint;
  16. use Symfony\Component\Validator\ConstraintViolation;
  17. use Symfony\Component\Validator\ConstraintViolationList;
  18. use Symfony\Component\Validator\Validator\ValidatorInterface;
  19. /**
  20.  * @deprecated tag:v6.5.0 - reason:becomes-internal - Will be internal
  21.  */
  22. abstract class AbstractFieldSerializer implements FieldSerializerInterface
  23. {
  24.     /**
  25.      * @var ValidatorInterface
  26.      */
  27.     protected $validator;
  28.     /**
  29.      * @var DefinitionInstanceRegistry
  30.      */
  31.     protected $definitionRegistry;
  32.     /**
  33.      * @var array<Constraint[]>
  34.      */
  35.     private array $cachedConstraints = [];
  36.     public function __construct(ValidatorInterface $validatorDefinitionInstanceRegistry $definitionRegistry)
  37.     {
  38.         $this->validator $validator;
  39.         $this->definitionRegistry $definitionRegistry;
  40.     }
  41.     public function normalize(Field $field, array $dataWriteParameterBag $parameters): array
  42.     {
  43.         return $data;
  44.     }
  45.     protected function validate(
  46.         array $constraints,
  47.         KeyValuePair $data,
  48.         string $path
  49.     ): void {
  50.         $violationList = new ConstraintViolationList();
  51.         foreach ($constraints as $constraint) {
  52.             $violations $this->validator->validate($data->getValue(), $constraint);
  53.             /** @var ConstraintViolation $violation */
  54.             foreach ($violations as $violation) {
  55.                 $fieldName $data->getKey();
  56.                 // correct pointer for json fields with pre-defined structure
  57.                 if ($violation->getPropertyPath()) {
  58.                     $property str_replace('][''/'$violation->getPropertyPath());
  59.                     $property trim($property'][');
  60.                     $fieldName .= '/' $property;
  61.                 }
  62.                 $fieldName '/' $fieldName;
  63.                 $violationList->add(
  64.                     new ConstraintViolation(
  65.                         $violation->getMessage(),
  66.                         $violation->getMessageTemplate(),
  67.                         $violation->getParameters(),
  68.                         $violation->getRoot(),
  69.                         $fieldName,
  70.                         $violation->getInvalidValue(),
  71.                         $violation->getPlural(),
  72.                         $violation->getCode(),
  73.                         $violation->getConstraint(),
  74.                         $violation->getCause()
  75.                     )
  76.                 );
  77.             }
  78.         }
  79.         if (\count($violationList)) {
  80.             throw new WriteConstraintViolationException($violationList$path);
  81.         }
  82.     }
  83.     protected function requiresValidation(
  84.         Field $field,
  85.         EntityExistence $existence,
  86.         $value,
  87.         WriteParameterBag $parameters
  88.     ): bool {
  89.         if ($value !== null) {
  90.             return true;
  91.         }
  92.         if ($existence->isChild() && $this->isInherited($field$parameters)) {
  93.             return false;
  94.         }
  95.         if ($existence->hasEntityName()
  96.             && $this->definitionRegistry->getByEntityName($existence->getEntityName()) instanceof EntityTranslationDefinition
  97.             && $parameters->getCurrentWriteLanguageId() !== Defaults::LANGUAGE_SYSTEM
  98.         ) {
  99.             return false;
  100.         }
  101.         return $field->is(Required::class);
  102.     }
  103.     protected function isInherited(Field $fieldWriteParameterBag $parameters): bool
  104.     {
  105.         if ($parameters->getDefinition()->isInheritanceAware()) {
  106.             return $field->is(Inherited::class);
  107.         }
  108.         if (!$parameters->getDefinition() instanceof EntityTranslationDefinition) {
  109.             return false;
  110.         }
  111.         $parent $parameters->getDefinition()->getParentDefinition();
  112.         $field $parent->getFields()->get($field->getPropertyName());
  113.         return $field->is(Inherited::class);
  114.     }
  115.     protected function validateIfNeeded(Field $fieldEntityExistence $existenceKeyValuePair $dataWriteParameterBag $parameters): void
  116.     {
  117.         if (!$this->requiresValidation($field$existence$data->getValue(), $parameters)) {
  118.             return;
  119.         }
  120.         $constraints $this->getCachedConstraints($field);
  121.         $this->validate($constraints$data$parameters->getPath());
  122.     }
  123.     /**
  124.      * @return Constraint[]
  125.      */
  126.     protected function getConstraints(Field $field): array
  127.     {
  128.         return [];
  129.     }
  130.     /**
  131.      * @return Constraint[]
  132.      */
  133.     protected function getCachedConstraints(Field $field): array
  134.     {
  135.         $key $field->getPropertyName() . spl_object_id($field);
  136.         if (\array_key_exists($key$this->cachedConstraints)) {
  137.             return $this->cachedConstraints[$key];
  138.         }
  139.         return $this->cachedConstraints[$key] = $this->getConstraints($field);
  140.     }
  141.     protected function sanitize(HtmlSanitizer $sanitizerKeyValuePair $dataField $fieldEntityExistence $existence): ?string
  142.     {
  143.         if ($data->getValue() === null) {
  144.             return null;
  145.         }
  146.         if (!$field->is(AllowHtml::class)) {
  147.             return strip_tags((string) $data->getValue());
  148.         }
  149.         $flag $field->getFlag(AllowHtml::class);
  150.         if ($flag instanceof AllowHtml && $flag->isSanitized()) {
  151.             $fieldKey sprintf('%s.%s', (string) $existence->getEntityName(), $field->getPropertyName());
  152.             return $sanitizer->sanitize((string) $data->getValue(), [], false$fieldKey);
  153.         }
  154.         return (string) $data->getValue();
  155.     }
  156. }