Skip to content

Commit 1985522

Browse files
committedJul 2, 2024·
Fix the index service definition
1 parent 51cb0cf commit 1985522

File tree

10 files changed

+36
-46
lines changed

10 files changed

+36
-46
lines changed
 

‎src/Config/Index.php

+17-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Setono\SyliusMeilisearchPlugin\Config;
66

7+
use Psr\Container\ContainerInterface;
78
use Setono\SyliusMeilisearchPlugin\Document\Document;
89
use Setono\SyliusMeilisearchPlugin\Indexer\IndexerInterface;
910
use Setono\SyliusMeilisearchPlugin\Model\IndexableInterface;
@@ -24,14 +25,13 @@ public function __construct(
2425
* @var class-string<Document> $document
2526
*/
2627
public readonly string $document,
27-
public readonly IndexerInterface $indexer,
28-
2928
/**
3029
* A list of entities that should be indexed in this index
3130
*
3231
* @var list<class-string<IndexableInterface>> $entities
3332
*/
3433
public readonly array $entities,
34+
private readonly ContainerInterface $locator,
3535
public readonly ?string $prefix = null,
3636
) {
3737
if (!is_a($document, Document::class, true)) {
@@ -41,6 +41,21 @@ public function __construct(
4141
Document::class,
4242
));
4343
}
44+
45+
foreach ($entities as $entity) {
46+
if (!is_a($entity, IndexableInterface::class, true)) {
47+
throw new \InvalidArgumentException(sprintf(
48+
'The entity class %s MUST be an instance of %s',
49+
$entity,
50+
IndexableInterface::class,
51+
));
52+
}
53+
}
54+
}
55+
56+
public function indexer(): IndexerInterface
57+
{
58+
return $this->locator->get(IndexerInterface::class);
4459
}
4560

4661
/**

‎src/DependencyInjection/Compiler/RegisterIndexesPass.php

+9-9
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66

77
use Setono\SyliusMeilisearchPlugin\Config\Index;
88
use Setono\SyliusMeilisearchPlugin\Document\Document;
9-
use Setono\SyliusMeilisearchPlugin\Exception\NonExistingIndexerException;
9+
use Setono\SyliusMeilisearchPlugin\Indexer\IndexerInterface;
1010
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
11+
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
1112
use Symfony\Component\DependencyInjection\ContainerBuilder;
1213
use Symfony\Component\DependencyInjection\Definition;
1314
use Symfony\Component\DependencyInjection\Reference;
@@ -20,27 +21,26 @@ public function process(ContainerBuilder $container): void
2021
return;
2122
}
2223

23-
$indexers = array_keys($container->findTaggedServiceIds('setono_sylius_meilisearch.indexer'));
2424
$indexRegistry = $container->getDefinition('setono_sylius_meilisearch.config.index_registry');
2525

2626
/** @var array<string, array{document: class-string<Document>, indexer: string, entities: list<class-string>, prefix: string}> $indexes */
2727
$indexes = $container->getParameter('setono_sylius_meilisearch.indexes');
2828

2929
foreach ($indexes as $indexName => $index) {
30-
if (!in_array($index['indexer'], $indexers, true)) {
31-
throw NonExistingIndexerException::fromServiceId($index['indexer'], $indexers);
32-
}
30+
$indexServiceId = sprintf('setono_sylius_meilisearch.index.%s', $indexName);
3331

34-
$indexDefinitionName = sprintf('setono_sylius_meilisearch.index.%s', $indexName);
35-
$container->setDefinition($indexDefinitionName, new Definition(Index::class, [
32+
$container->setDefinition($indexServiceId, new Definition(Index::class, [
3633
$indexName,
3734
$index['document'],
38-
new Reference($index['indexer']),
3935
$index['entities'],
36+
ServiceLocatorTagPass::register($container, [IndexerInterface::class => new Reference($index['indexer'])]),
4037
$index['prefix'],
4138
]));
4239

43-
$indexRegistry->addMethodCall('add', [new Reference($indexDefinitionName)]);
40+
$indexRegistry->addMethodCall('add', [new Reference($indexServiceId)]);
41+
42+
$indexer = $container->getDefinition($index['indexer']);
43+
$indexer->setArgument('$index', new Reference($indexServiceId));
4444
}
4545
}
4646
}

‎src/DependencyInjection/Configuration.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Setono\SyliusMeilisearchPlugin\DependencyInjection;
66

77
use Setono\SyliusMeilisearchPlugin\Document\Product;
8+
use Setono\SyliusMeilisearchPlugin\Indexer\DefaultIndexer;
89
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
910
use Symfony\Component\Config\Definition\ConfigurationInterface;
1011

@@ -34,7 +35,7 @@ public function getConfigTreeBuilder(): TreeBuilder
3435
->scalarNode('indexer')
3536
->info('This is the service id of the indexer that will be used to index entities on this index')
3637
->cannotBeEmpty()
37-
->defaultValue('setono_sylius_meilisearch.indexer.default')
38+
->defaultValue(DefaultIndexer::class)
3839
->end()
3940
->arrayNode('entities')
4041
->info('The Doctrine entities that make up this index. Examples could be "App\Entity\Product\Product", "App\Entity\Taxonomy\Taxon", etc.')

‎src/Exception/NonExistingIndexerException.php

-22
This file was deleted.

‎src/Message/Handler/IndexEntitiesHandler.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function __invoke(IndexEntities $message): void
3535
Assert::allIsInstanceOf($entities, $message->class);
3636

3737
foreach ($this->indexRegistry->getByEntity($message->class) as $index) {
38-
$index->indexer->indexEntities($entities);
38+
$index->indexer()->indexEntities($entities);
3939
}
4040
}
4141
}

‎src/Message/Handler/IndexEntityHandler.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ final class IndexEntityHandler extends AbstractEntityHandler
1111
{
1212
protected function execute(IndexableInterface $entity, Index $index): void
1313
{
14-
$index->indexer->indexEntity($entity);
14+
$index->indexer()->indexEntity($entity);
1515
}
1616
}

‎src/Message/Handler/IndexHandler.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public function __construct(private readonly IndexRegistry $indexRegistry)
1818
public function __invoke(Index $message): void
1919
{
2020
try {
21-
$this->indexRegistry->get($message->index)->indexer->index();
21+
$this->indexRegistry->get($message->index)->indexer()->index();
2222
} catch (NonExistingIndexException $e) {
2323
throw new UnrecoverableMessageHandlingException(message: $e->getMessage(), previous: $e);
2424
}

‎src/Message/Handler/RemoveEntityHandler.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ final class RemoveEntityHandler extends AbstractEntityHandler
1111
{
1212
protected function execute(IndexableInterface $entity, Index $index): void
1313
{
14-
$index->indexer->removeEntity($entity);
14+
$index->indexer()->removeEntity($entity);
1515
}
1616
}

‎src/Resources/config/services/indexer.xml

+2-6
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,17 @@
33
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
44
<services>
55
<!-- TODO: Should be created in the extension of the plugin -->
6-
<service id="setono_sylius_meilisearch.indexer.default"
7-
class="Setono\SyliusMeilisearchPlugin\Indexer\DefaultIndexer">
6+
<service id="Setono\SyliusMeilisearchPlugin\Indexer\DefaultIndexer">
7+
<argument/> <!-- The index -->
88
<argument type="service" id="doctrine"/>
99
<argument type="service" id="setono_sylius_meilisearch.provider.index_scope.composite"/>
1010
<argument type="service" id="setono_sylius_meilisearch.resolver.index_name"/>
1111
<argument type="service" id="setono_sylius_meilisearch.provider.index_settings"/>
1212
<argument type="service" id="setono_sylius_meilisearch.data_mapper.composite"/>
13-
<argument type="service" id="setono_sylius_meilisearch.command_bus"/>
1413
<argument type="service" id="serializer"/>
1514
<argument type="service" id="Meilisearch\Client"/>
16-
<argument type="service" id="setono_sylius_meilisearch.config.index_registry"/>
1715
<argument type="service" id="setono_sylius_meilisearch.filter.doctrine.composite"/>
1816
<argument type="service" id="setono_sylius_meilisearch.filter.object.composite"/>
19-
20-
<tag name="setono_sylius_meilisearch.indexer"/>
2117
</service>
2218
</services>
2319
</container>

‎tests/Resolver/IndexName/IndexNameResolverTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
use Setono\SyliusMeilisearchPlugin\Config\Index;
1010
use Setono\SyliusMeilisearchPlugin\Config\IndexRegistry;
1111
use Setono\SyliusMeilisearchPlugin\Document\Product;
12-
use Setono\SyliusMeilisearchPlugin\Indexer\IndexerInterface;
1312
use Setono\SyliusMeilisearchPlugin\IndexScope\IndexScope;
1413
use Setono\SyliusMeilisearchPlugin\Provider\IndexScope\IndexScopeProviderInterface;
1514
use Setono\SyliusMeilisearchPlugin\Resolver\IndexName\IndexNameResolver;
15+
use Symfony\Component\DependencyInjection\Container;
1616

1717
/**
1818
* @covers \Setono\SyliusMeilisearchPlugin\Resolver\IndexName\IndexNameResolver
@@ -29,8 +29,8 @@ public function it_resolves_from_index_scope(): void
2929
$index = new Index(
3030
'products',
3131
Product::class,
32-
$this->prophesize(IndexerInterface::class)->reveal(),
3332
[],
33+
new Container(),
3434
'prefix',
3535
);
3636

0 commit comments

Comments
 (0)
Please sign in to comment.