vendor/shopware/core/Framework/DataAbstractionLayer/FieldSerializer/ListFieldSerializer.php line 68

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shopware\Core\Framework\DataAbstractionLayer\FieldSerializer;
  4. use Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InvalidSerializerFieldException;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Field\Field;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Field\ListField;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Write\DataStack\KeyValuePair;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Write\EntityExistence;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Write\FieldException\WriteFieldException;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Write\WriteParameterBag;
  12. use Shopware\Core\Framework\Feature;
  13. use Shopware\Core\Framework\Log\Package;
  14. use Symfony\Component\Validator\Constraints\Type;
  15. use Symfony\Component\Validator\Validator\ValidatorInterface;
  16. /**
  17. * @deprecated tag:v6.5.0 - reason:becomes-internal - Will be internal
  18. */
  19. #[Package('core')]
  20. class ListFieldSerializer extends AbstractFieldSerializer
  21. {
  22. /**
  23. * @internal
  24. */
  25. public function __construct(
  26. ValidatorInterface $validator,
  27. DefinitionInstanceRegistry $definitionRegistry
  28. ) {
  29. parent::__construct($validator, $definitionRegistry);
  30. }
  31. /**
  32. * @throws InvalidSerializerFieldException
  33. */
  34. public function encode(
  35. Field $field,
  36. EntityExistence $existence,
  37. KeyValuePair $data,
  38. WriteParameterBag $parameters
  39. ): \Generator {
  40. if (!$field instanceof ListField) {
  41. throw new InvalidSerializerFieldException(ListField::class, $field);
  42. }
  43. $this->validateIfNeeded($field, $existence, $data, $parameters);
  44. $value = $data->getValue();
  45. if ($value !== null) {
  46. $value = array_values($value);
  47. $this->validateTypes($field, $value, $parameters);
  48. $value = JsonFieldSerializer::encodeJson($value);
  49. }
  50. yield $field->getStorageName() => $value;
  51. }
  52. /**
  53. * @return array|null
  54. *
  55. * @deprecated tag:v6.5.0 - reason:return-type-change - The return type will be native typed
  56. */
  57. public function decode(Field $field, $value)/* ?array*/
  58. {
  59. if ($value === null) {
  60. return null;
  61. }
  62. /** @deprecated tag:v6.5.0 - remove whole is block as the `strict` behaviour will always be used */
  63. if (!Feature::isActive('v6.5.0.0')) {
  64. if ($field instanceof ListField && $field->isStrict()) {
  65. return array_values(json_decode($value, true));
  66. }
  67. return json_decode($value, true);
  68. }
  69. return array_values(json_decode($value, true));
  70. }
  71. protected function getConstraints(Field $field): array
  72. {
  73. return [new Type('array')];
  74. }
  75. protected function validateTypes(ListField $field, array $values, WriteParameterBag $parameters): void
  76. {
  77. $fieldType = $field->getFieldType();
  78. if ($fieldType === null) {
  79. return;
  80. }
  81. $existence = new EntityExistence(null, [], false, false, false, []);
  82. /** @var Field $listField */
  83. $listField = new $fieldType('key', 'key');
  84. $listField->compile($this->definitionRegistry);
  85. $nestedParameters = $parameters->cloneForSubresource(
  86. $parameters->getDefinition(),
  87. $parameters->getPath() . '/' . $field->getPropertyName()
  88. );
  89. foreach ($values as $i => $value) {
  90. try {
  91. $kvPair = new KeyValuePair((string) $i, $value, true);
  92. $x = $listField->getSerializer()->encode($listField, $existence, $kvPair, $nestedParameters);
  93. $_x = iterator_to_array($x);
  94. } catch (WriteFieldException $exception) {
  95. $parameters->getContext()->getExceptions()->add($exception);
  96. }
  97. }
  98. }
  99. }