Skip to content

Commit 3430b43

Browse files
[Export] Add data providers registry and resolve based on configuration
1 parent 0d6c2aa commit 3430b43

File tree

7 files changed

+90
-11
lines changed

7 files changed

+90
-11
lines changed

config/services.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<argument type="service" id="sylius.resource_registry" />
1515
<argument type="service" id="sylius_import_export.custom_factory.process" />
1616
<argument type="service" id="sylius_grid_import_export.repository.process" />
17-
<argument type="service" id="sylius_import_export.provider.resource_data.grid" />
17+
<argument type="service" id="sylius_import_export.registry.resource_data_provider" />
1818
<argument type="service" id="sylius_grid_import_export.exporter_resolver" />
1919

2020
<tag name="messenger.message_handler" bus="sylius.command_bus" />

config/services/provider.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,22 @@
66
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
77
>
88
<services>
9+
<service id="sylius_import_export.registry.resource_data_provider" class="Sylius\GridImportExport\Provider\Registry\ResourceDataProviderRegistry">
10+
<argument>%sylius_import_export.export.resources%</argument>
11+
<argument type="tagged_iterator" tag="sylius_import_export.resource_data_provider" index-by="service" />
12+
</service>
13+
914
<service id="sylius_import_export.provider.resource_data.dbal" class="Sylius\GridImportExport\Provider\ResourceData\DbalResourceDataProvider">
1015
<argument type="service" id="doctrine.orm.entity_manager" />
16+
17+
<tag name="sylius_import_export.resource_data_provider" />
1118
</service>
1219

1320
<service id="sylius_import_export.provider.resource_data.grid" class="Sylius\GridImportExport\Provider\ResourceData\GridResourceDataProvider">
1421
<argument type="service" id="sylius.grid.chain_provider" />
1522
<argument type="service" id="sylius.grid.data_source_provider" />
23+
24+
<tag name="sylius_import_export.resource_data_provider" />
1625
</service>
1726

1827
<service id="sylius_import_export.provider.resources_ids" class="Sylius\GridImportExport\Provider\ResourceIds\CompositeResourceIdsProvider">

src/Controller/ExportAction.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use Sylius\GridImportExport\Provider\ResourceIds\ResourcesIdsProviderInterface;
2020
use Sylius\Resource\Metadata\RegistryInterface;
2121
use Symfony\Component\Form\FormFactoryInterface;
22-
use Symfony\Component\Form\FormInterface;
2322
use Symfony\Component\HttpFoundation\RedirectResponse;
2423
use Symfony\Component\HttpFoundation\Request;
2524
use Symfony\Component\HttpFoundation\Response;

src/DependencyInjection/Configuration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ private function addExportConfiguration(ArrayNodeDefinition $node): void
3939
->isRequired()
4040
->children()
4141
->scalarNode('default_provider')
42-
->defaultValue('orm')
42+
->defaultValue('sylius_import_export.provider.resource_data.grid')
4343
->cannotBeEmpty()
4444
->end()
4545
->scalarNode('default_section')

src/Messenger/Handler/ExportCommandHandler.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use Sylius\GridImportExport\Exception\ExportFailedException;
1818
use Sylius\GridImportExport\Factory\ProcessFactoryInterface;
1919
use Sylius\GridImportExport\Messenger\Command\ExportCommand;
20-
use Sylius\GridImportExport\Provider\ResourceData\ResourceDataProviderInterface;
20+
use Sylius\GridImportExport\Provider\Registry\ResourceDataProviderRegistryInterface;
2121
use Sylius\GridImportExport\Resolver\ExporterResolverInterface;
2222
use Sylius\Resource\Doctrine\Persistence\RepositoryInterface;
2323
use Sylius\Resource\Metadata\RegistryInterface;
@@ -31,7 +31,7 @@ public function __construct(
3131
public RegistryInterface $metadataRegistry,
3232
public ProcessFactoryInterface $processFactory,
3333
public RepositoryInterface $processRepository,
34-
public ResourceDataProviderInterface $resourceDataProvider,
34+
public ResourceDataProviderRegistryInterface $dataProviderRegistry,
3535
public ExporterResolverInterface $exporterResolver,
3636
) {
3737
}
@@ -46,12 +46,10 @@ public function __invoke(ExportCommand $command): void
4646

4747
$resourceMetadata = $this->metadataRegistry->get($command->resource);
4848

49-
$data = $this->resourceDataProvider->getData(
50-
$resourceMetadata,
51-
$command->grid,
52-
$command->resourceIds,
53-
$command->parameters,
54-
);
49+
$data = $this->dataProviderRegistry
50+
->getProvider($resourceMetadata)
51+
->getData($resourceMetadata, $command->grid, $command->resourceIds, $command->parameters)
52+
;
5553

5654
try {
5755
$outputPath = $resolver->export($data);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\GridImportExport\Provider\Registry;
15+
16+
use Sylius\GridImportExport\Exception\ProviderException;
17+
use Sylius\GridImportExport\Provider\ResourceData\ResourceDataProviderInterface;
18+
use Sylius\Resource\Metadata\MetadataInterface;
19+
20+
final class ResourceDataProviderRegistry implements ResourceDataProviderRegistryInterface
21+
{
22+
/**
23+
* @param array<string, array{provider: string, sections: string[]}> $exportResourcesConfig
24+
* @param iterable<string, ResourceDataProviderInterface> $resourceDataProviders
25+
*/
26+
public function __construct(
27+
private array $exportResourcesConfig,
28+
private iterable $resourceDataProviders,
29+
) {
30+
}
31+
32+
public function getProvider(MetadataInterface $resourceMetadata): ResourceDataProviderInterface
33+
{
34+
$resourceAlias = $resourceMetadata->getAlias();
35+
$resourceConfig = $this->exportResourcesConfig[$resourceAlias] ?? null;
36+
if (null === $resourceConfig) {
37+
throw new ProviderException(sprintf(
38+
'Provider configuration for resource "%s" is missing',
39+
$resourceAlias,
40+
));
41+
}
42+
43+
foreach ($this->resourceDataProviders as $serviceId => $provider) {
44+
if ($serviceId === $resourceConfig['provider']) {
45+
return $provider;
46+
}
47+
}
48+
49+
throw new ProviderException(sprintf('There is not data provider for resource "%s"', $resourceAlias));
50+
}
51+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\GridImportExport\Provider\Registry;
15+
16+
use Sylius\GridImportExport\Provider\ResourceData\ResourceDataProviderInterface;
17+
use Sylius\Resource\Metadata\MetadataInterface;
18+
19+
interface ResourceDataProviderRegistryInterface
20+
{
21+
public function getProvider(MetadataInterface $resourceMetadata): ResourceDataProviderInterface;
22+
}

0 commit comments

Comments
 (0)