diff --git a/src/batch/src/Job/Item/Reader/AddMetadataReader.php b/src/batch/src/Job/Item/Reader/AddMetadataReader.php new file mode 100644 index 00000000..63692d04 --- /dev/null +++ b/src/batch/src/Job/Item/Reader/AddMetadataReader.php @@ -0,0 +1,72 @@ + + */ + private array $metadata; + + /** + * @phpstan-param array $metadata + */ + public function __construct(ItemReaderInterface $reader, array $metadata) + { + $this->reader = $reader; + $this->metadata = $metadata; + } + + /** + * @inheritDoc + */ + public function initialize(): void + { + $this->configureElementJobContext($this->reader, $this->jobExecution); + $this->initializeElement($this->reader); + } + + /** + * @inheritdoc + * @phpstan-return Generator> + */ + public function read(): Generator + { + foreach ($this->reader->read() as $item) { + if (!\is_array($item)) { + throw UnexpectedValueException::type('array', $item); + } + + yield $this->metadata + $item; + } + } + + /** + * @inheritDoc + */ + public function flush(): void + { + $this->flushElement($this->reader); + } +} diff --git a/src/batch/tests/Job/Item/Reader/AddMetadataReaderTest.php b/src/batch/tests/Job/Item/Reader/AddMetadataReaderTest.php new file mode 100644 index 00000000..760e112d --- /dev/null +++ b/src/batch/tests/Job/Item/Reader/AddMetadataReaderTest.php @@ -0,0 +1,46 @@ + 'John'], ['name' => 'Jane']]), + ['_type' => 'user'] + ); + + $reader->setJobExecution(JobExecution::createRoot('123456', 'test')); + $reader->initialize(); + $read = \iterator_to_array($reader->read()); + $reader->flush(); + + self::assertSame( + [['_type' => 'user', 'name' => 'John'], ['_type' => 'user', 'name' => 'Jane']], + $read + ); + } + + public function testReadDecoratedNotReturningAnArray(): void + { + $this->expectException(UnexpectedValueException::class); + + $reader = new AddMetadataReader( + new StaticIterableReader(['string']), + ['_type' => 'user'] + ); + + $reader->setJobExecution(JobExecution::createRoot('123456', 'test')); + $reader->initialize(); + \iterator_to_array($reader->read()); + } +}