Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.24% covered (success)
95.24%
20 / 21
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
EntityExport
95.24% covered (success)
95.24%
20 / 21
66.67% covered (warning)
66.67%
2 / 3
7
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 streamFromEntityList
94.74% covered (success)
94.74%
18 / 19
0.00% covered (danger)
0.00%
0 / 1
5.00
 getSupportedExtensions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\Export;
3
4use Apie\Core\Context\ApieContext;
5use Apie\Core\Datalayers\Lists\EntityListInterface;
6use Apie\Core\PropertyAccess;
7use Apie\Export\Lists\FileExtensionList;
8use Apie\HtmlBuilders\Columns\ColumnSelector;
9use Apie\Serializer\Serializer;
10use Psr\Http\Message\StreamInterface;
11
12class EntityExport
13{
14    public function __construct(
15        private readonly ColumnSelector $columnSelector,
16        private readonly ExportInterface $exporter,
17        private readonly Serializer $serializer
18    ) {
19    }
20    
21    public function streamFromEntityList(\ReflectionClass $resourceName, EntityListInterface $entityList, ApieContext $apieContext, string $outputFilename = 'export.xlsx'): StreamInterface
22    {
23        $columns = $this->columnSelector->getColumns($resourceName, $apieContext);
24        $generator = function () use ($entityList, $columns, $apieContext) {
25            $first = true;
26            yield $columns;
27            foreach ($entityList as $entity) {
28                $data = [];
29                foreach ($columns as $column) {
30                    $data[$column] = $this->serializer->normalize(
31                        PropertyAccess::getPropertyValue($entity, [$column], $apieContext, false),
32                        $apieContext
33                    );
34                    if (is_array($data[$column])) {
35                        $data[$column] = implode(', ', $data[$column]);
36                    }
37                }
38                if ($first) {
39                    yield $columns;
40                    $first = false;
41                }
42                yield array_values($data);
43            }
44        };
45        return $this->exporter->streamFromSheets([$resourceName->getShortName() => $generator()], $outputFilename);
46    }
47
48    public function getSupportedExtensions(): FileExtensionList
49    {
50        return $this->exporter->getSupportedExtensions();
51    }
52}