Skip to content

Commit add9d4a

Browse files
committed
Add Data providers extension point
1 parent ae6fe92 commit add9d4a

File tree

64 files changed

+1823
-384
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1823
-384
lines changed

.github/workflows/pre-release-tests.yml

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,39 +39,30 @@ jobs:
3939
MEILI_NO_ANALYTICS: true
4040
strategy:
4141
matrix:
42-
php-version: ['7.4', '8.1', '8.2', '8.3', '8.4']
43-
sf-version: ['5.4', '6.4', '7.0', '7.1', '7.2', '7.3']
42+
php-version: [ '8.1', '8.2', '8.3', '8.4' ]
43+
sf-version: ['6.4', '7.0', '7.1', '7.2', '7.3' ]
44+
dependencies: [ 'default' ]
4445
exclude:
45-
- php-version: '7.4'
46-
sf-version: '6.4'
47-
- php-version: '7.4'
48-
sf-version: '7.0'
49-
- php-version: '7.4'
50-
sf-version: '7.1'
51-
- php-version: '7.4'
52-
sf-version: '7.3'
53-
- php-version: '8.1'
54-
sf-version: '5.4'
5546
- php-version: '8.1'
5647
sf-version: '7.0'
5748
- php-version: '8.1'
5849
sf-version: '7.1'
5950
- php-version: '8.1'
60-
sf-version: '7.3'
61-
- php-version: '8.2'
62-
sf-version: '5.4'
63-
- php-version: '8.3'
64-
sf-version: '5.4'
65-
- php-version: '8.4'
66-
sf-version: '5.4'
67-
- php-version: '7.4'
68-
sf-version: '7.2'
69-
- php-version: '8.0'
7051
sf-version: '7.2'
7152
- php-version: '8.1'
72-
sf-version: '7.2'
53+
sf-version: '7.3'
54+
include:
55+
- php-version: '8.4'
56+
sf-version: '6.4'
57+
dependencies: 'lowest'
58+
- php-version: '8.4'
59+
sf-version: '6.4'
60+
dependencies: 'highest'
61+
- php-version: '8.4'
62+
sf-version: '7.3'
63+
dependencies: 'highest'
7364

74-
name: integration-tests-against-rc (PHP ${{ matrix.php-version }}) (Symfony ${{ matrix.sf-version }}.*)
65+
name: integration-tests-against-rc (PHP ${{ matrix.php-version }}) (Symfony ${{ matrix.sf-version }}.*)${{ matrix.dependencies != 'default' && format(' ({0})', matrix.dependencies) || '' }}
7566
steps:
7667
- name: Checkout code
7768
uses: actions/checkout@v6
@@ -85,16 +76,13 @@ jobs:
8576
- name: Validate composer.json and composer.lock
8677
run: composer validate
8778

88-
- name: Remove doctrine/annotations
89-
if: matrix.php-version != '7.4'
90-
run: sed -i '/doctrine\/annotations/d' composer.json
91-
9279
- name: Install dependencies
9380
uses: ramsey/composer-install@v3
9481
env:
9582
SYMFONY_REQUIRE: ${{ matrix.sf-version }}.*
9683
with:
97-
dependency-versions: 'highest'
84+
composer-options: --no-interaction --no-progress --prefer-dist --no-security-blocking
85+
dependency-versions: "${{ matrix.dependencies }}"
9886

9987
- name: Run test suite
10088
run: composer test:unit -- --coverage-clover coverage.xml

.github/workflows/tests.yml

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,10 @@ jobs:
2525
MEILI_NO_ANALYTICS: true
2626
strategy:
2727
matrix:
28-
php-version: [ '7.4', '8.1', '8.2', '8.3', '8.4' ]
29-
sf-version: [ '5.4', '6.4', '7.0', '7.1', '7.2', '7.3' ]
28+
php-version: [ '8.1', '8.2', '8.3', '8.4' ]
29+
sf-version: ['6.4', '7.0', '7.1', '7.2', '7.3' ]
3030
dependencies: [ 'default' ]
3131
exclude:
32-
- php-version: '7.4'
33-
sf-version: '6.4'
34-
- php-version: '7.4'
35-
sf-version: '7.0'
36-
- php-version: '7.4'
37-
sf-version: '7.1'
38-
- php-version: '7.4'
39-
sf-version: '7.2'
40-
- php-version: '7.4'
41-
sf-version: '7.3'
42-
- php-version: '8.1'
43-
sf-version: '5.4'
4432
- php-version: '8.1'
4533
sf-version: '7.0'
4634
- php-version: '8.1'
@@ -49,19 +37,7 @@ jobs:
4937
sf-version: '7.2'
5038
- php-version: '8.1'
5139
sf-version: '7.3'
52-
- php-version: '8.2'
53-
sf-version: '5.4'
54-
- php-version: '8.3'
55-
sf-version: '5.4'
56-
- php-version: '8.4'
57-
sf-version: '5.4'
5840
include:
59-
- php-version: '7.4'
60-
sf-version: '5.4'
61-
dependencies: 'lowest'
62-
- php-version: '7.4'
63-
sf-version: '5.4'
64-
dependencies: 'highest'
6541
- php-version: '8.4'
6642
sf-version: '6.4'
6743
dependencies: 'lowest'
@@ -86,10 +62,6 @@ jobs:
8662
- name: Validate composer.json
8763
run: composer validate
8864

89-
- name: Remove doctrine/annotations
90-
if: matrix.php-version != '7.4'
91-
run: sed -i '/doctrine\/annotations/d' composer.json
92-
9365
- name: Install dependencies
9466
uses: ramsey/composer-install@v3
9567
env:
@@ -124,7 +96,7 @@ jobs:
12496
- name: Install dependencies
12597
uses: ramsey/composer-install@v3
12698
env:
127-
SYMFONY_REQUIRE: 7.2.*
99+
SYMFONY_REQUIRE: 7.4.*
128100
with:
129101
composer-options: '--no-progress --quiet'
130102
dependency-versions: 'highest'

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,14 @@ Say goodbye to server deployment and manual updates with [Meilisearch Cloud](htt
5050

5151
* **Require** PHP 7.4 and later.
5252
* **Compatible** with Symfony 5.4 and later.
53-
* **Support** Doctrine ORM.
5453

5554
For support of older versions, see older versions of this bundle.
5655

56+
## Doctrine Integration
57+
58+
To enable Doctrine integration you have to install `doctrine/orm` and `doctrine/doctrine-bundle`
59+
packages.
60+
5761
## 🤖 Compatibility with Meilisearch
5862

5963
This package guarantees compatibility with [version v1.x of Meilisearch](https://github.com/meilisearch/meilisearch/releases/latest), but some features may not be present. Please check the [issues](https://github.com/meilisearch/meilisearch-symfony/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22+label%3Aenhancement) for more info.

composer.json

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,40 +18,38 @@
1818
}
1919
],
2020
"require": {
21-
"php": "^7.4|^8.0",
21+
"php": "^8.1",
2222
"ext-json": "*",
23-
"doctrine/doctrine-bundle": "^2.10 || ^3.0",
2423
"meilisearch/meilisearch-php": "^1.16",
25-
"symfony/config": "^5.4 || ^6.0 || ^7.0",
26-
"symfony/dependency-injection": "^5.4.17 || ^6.0 || ^7.0",
27-
"symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
28-
"symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
29-
"symfony/polyfill-php80": "^1.27",
30-
"symfony/property-access": "^5.4 || ^6.0 || ^7.0",
31-
"symfony/serializer": "^5.4 || ^6.0 || ^7.0"
24+
"symfony/config": "^6.4 || ^7.0",
25+
"symfony/dependency-injection": "^6.4 || ^7.0",
26+
"symfony/event-dispatcher": "^6.4 || ^7.0",
27+
"symfony/http-kernel": "^6.4 || ^7.0",
28+
"symfony/property-access": "^6.4 || ^7.0",
29+
"symfony/serializer": "^6.4 || ^7.0"
3230
},
3331
"require-dev": {
34-
"doctrine/annotations": "^2.0.0",
32+
"doctrine/doctrine-bundle": "^2.10 || ^3.0",
3533
"doctrine/orm": "^2.12 || ^3.0",
3634
"matthiasnoback/symfony-config-test": "^4.3 || ^5.2",
3735
"matthiasnoback/symfony-dependency-injection-test": "^4.3 || ^5.1",
3836
"nikic/php-parser": "^5.6.2",
3937
"nyholm/psr7": "^1.8.2",
40-
"php-cs-fixer/shim": "^3.88.2",
38+
"php-cs-fixer/shim": "^3.90.0",
4139
"phpmd/phpmd": "^2.15",
4240
"phpstan/extension-installer": "^1.4.3",
43-
"phpstan/phpstan": "^2.1.31",
44-
"phpstan/phpstan-doctrine": "^2.0.10",
45-
"phpstan/phpstan-phpunit": "^2.0.7",
41+
"phpstan/phpstan": "^2.1.32",
42+
"phpstan/phpstan-doctrine": "^2.0.11",
43+
"phpstan/phpstan-phpunit": "^2.0.8",
4644
"phpstan/phpstan-symfony": "^2.0.8",
4745
"phpunit/php-code-coverage": "^9.2.32",
48-
"symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0",
49-
"symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
50-
"symfony/framework-bundle": "^5.4.17 || ^6.0 || ^7.0",
51-
"symfony/http-client": "^5.4.47 || ^6.4.15 || ^7.1.8",
46+
"symfony/doctrine-bridge": "^6.4 || ^7.0",
47+
"symfony/filesystem": "^6.4 || ^7.0",
48+
"symfony/framework-bundle": "^6.4 || ^7.0",
49+
"symfony/http-client": "^6.4.15 || ^7.1.8",
5250
"symfony/phpunit-bridge": "^7.3",
53-
"symfony/yaml": "^5.4 || ^6.0 || ^7.0",
54-
"symfony/var-exporter": "^5.4 || ^6.0 || ^7.0"
51+
"symfony/yaml": "^6.4 || ^7.0",
52+
"symfony/var-exporter": "^6.4 || ^7.0"
5553
},
5654
"autoload": {
5755
"psr-4": {

config/doctrine.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
4+
5+
use Meilisearch\Bundle\EventListener\DoctrineEventSubscriber;
6+
7+
return static function (ContainerConfigurator $container) {
8+
$services = $container->services();
9+
10+
$services->set('meilisearch.search_indexer_subscriber', DoctrineEventSubscriber::class)
11+
->public()
12+
->args([
13+
service('meilisearch.manager')
14+
])
15+
16+
;
17+
};

config/services.php

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@
77
use Meilisearch\Bundle\Command\MeilisearchDeleteCommand;
88
use Meilisearch\Bundle\Command\MeilisearchImportCommand;
99
use Meilisearch\Bundle\Command\MeilisearchUpdateSettingsCommand;
10+
use Meilisearch\Bundle\DataProvider\DataProviderRegistry;
11+
use Meilisearch\Bundle\DataProvider\DataProviderRegistryInterface;
1012
use Meilisearch\Bundle\Engine;
11-
use Meilisearch\Bundle\EventListener\DoctrineEventSubscriber;
13+
use Meilisearch\Bundle\Identifier\DefaultIdNormalizer;
14+
use Meilisearch\Bundle\Identifier\IdNormalizerInterface;
15+
use Meilisearch\Bundle\SearchManagerInterface;
1216
use Meilisearch\Bundle\SearchService;
17+
use Meilisearch\Bundle\Services\MeilisearchManager;
1318
use Meilisearch\Bundle\Services\MeilisearchService;
1419
use Meilisearch\Bundle\Services\SettingsUpdater;
1520
use Meilisearch\Bundle\Services\UnixTimestampNormalizer;
@@ -30,15 +35,14 @@
3035
service('meilisearch.engine'),
3136
abstract_arg('configuration'),
3237
service('property_accessor'),
38+
service('meilisearch.manager'),
3339
]);
3440

3541
$services->alias('search.service', 'meilisearch.service')
3642
->public()
3743
->deprecate('meilisearch/search-bundle', '0.14', 'The "%alias_id%" service alias is deprecated. Use "meilisearch.service" instead.');
3844

39-
$services->set('meilisearch.search_indexer_subscriber', DoctrineEventSubscriber::class)
40-
->public()
41-
->args([service('meilisearch.service')]);
45+
$services->alias(SearchService::class, 'meilisearch.service');
4246

4347
$services->alias('search.search_indexer_subscriber', 'meilisearch.search_indexer_subscriber')
4448
->deprecate('meilisearch/search-bundle', '0.14', 'The "%alias_id%" service alias is deprecated. Use "meilisearch.search_indexer_subscriber" instead.');
@@ -62,52 +66,73 @@
6266
$services->alias(Client::class, 'meilisearch.client')
6367
->public();
6468

65-
$services->alias(SearchService::class, 'meilisearch.service');
69+
$services->set('meilisearch.manager', MeilisearchManager::class)
70+
->args([
71+
abstract_arg('normalizer'),
72+
service('meilisearch.engine'),
73+
service('property_accessor'),
74+
service('meilisearch.data_provider.registry'),
75+
abstract_arg('configuration'),
76+
]);
77+
$services->alias(SearchManagerInterface::class, 'meilisearch.manager');
6678

6779
$services->set('meilisearch.settings_updater', SettingsUpdater::class)
6880
->args([
69-
service('meilisearch.service'),
81+
service('meilisearch.manager'),
7082
service('meilisearch.client'),
7183
service('event_dispatcher'),
7284
]);
7385

7486
$services->alias(SettingsUpdater::class, 'meilisearch.settings_updater');
7587

7688
$services->set(MeilisearchClearCommand::class)
77-
->args([service('meilisearch.service')])
89+
->args([service('meilisearch.manager')])
7890
->tag('console.command', ['command' => 'meilisearch:clear|meili:clear', 'description' => 'Clear the index documents']);
7991

8092
$services->set(MeilisearchCreateCommand::class)
8193
->args([
82-
service('meilisearch.service'),
94+
service('meilisearch.manager'),
8395
service('meilisearch.client'),
8496
service('meilisearch.settings_updater'),
8597
service('event_dispatcher'),
8698
])
8799
->tag('console.command', ['command' => 'meilisearch:create|meili:create', 'description' => 'Create indexes']);
88100

89101
$services->set(MeilisearchDeleteCommand::class)
90-
->args([service('meilisearch.service')])
102+
->args([service('meilisearch.manager')])
91103
->tag('console.command', ['command' => 'meilisearch:delete|meili:delete', 'description' => 'Delete the indexes']);
92104

93105
$services->set(MeilisearchImportCommand::class)
94106
->args([
95-
service('meilisearch.service'),
96-
service('doctrine'),
107+
service('meilisearch.manager'),
97108
service('meilisearch.client'),
98109
service('meilisearch.settings_updater'),
99110
service('event_dispatcher'),
111+
service('meilisearch.data_provider.registry'),
100112
])
101113
->tag('console.command', ['command' => 'meilisearch:import|meili:import', 'description' => 'Import given entity into search engine']);
102114

103115
$services->set(MeilisearchUpdateSettingsCommand::class)
104116
->args([
105-
service('meilisearch.service'),
117+
service('meilisearch.manager'),
106118
service('meilisearch.settings_updater'),
107119
service('event_dispatcher'),
108120
])
109121
->tag('console.command', ['command' => 'meilisearch:update-settings', 'description' => 'Push settings to meilisearch']);
110122

111123
$services->set(UnixTimestampNormalizer::class)
112124
->tag('serializer.normalizer');
125+
126+
$services->set('meilisearch.data_provider.registry', DataProviderRegistry::class)
127+
->args([
128+
abstract_arg('provider locator'),
129+
abstract_arg('provider map'),
130+
])
131+
->alias(DataProviderRegistryInterface::class, 'meilisearch.data_provider.registry');
132+
133+
$services
134+
->set('meilisearch.identifier.default_id_normalizer', DefaultIdNormalizer::class)
135+
->alias(IdNormalizerInterface::class, 'meilisearch.identifier.default_id_normalizer')
136+
137+
;
113138
};

phpstan-baseline.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php declare(strict_types = 1);
2+
3+
$ignoreErrors = [];
4+
$ignoreErrors[] = [
5+
'message' => '#^Call to static method getClass\\(\\) on an unknown class Doctrine\\\\Common\\\\Util\\\\ClassUtils\\.$#',
6+
'identifier' => 'class.notFound',
7+
'count' => 1,
8+
'path' => __DIR__ . '/src/Services/MeilisearchManager.php',
9+
];
10+
$ignoreErrors[] = [
11+
'message' => '#^Call to static method getClass\\(\\) on an unknown class Doctrine\\\\Common\\\\Util\\\\ClassUtils\\.$#',
12+
'identifier' => 'class.notFound',
13+
'count' => 1,
14+
'path' => __DIR__ . '/src/Services/MeilisearchService.php',
15+
];
16+
$ignoreErrors[] = [
17+
'message' => '#^Offset \'hits\' on array\\{hits\\: array\\<int, mixed\\>, query\\: string, processingTimeMs\\: int, limit\\: int, offset\\: int, estimatedTotalHits\\: int, requestUid\\: non\\-empty\\-string, nbHits\\: int\\} in isset\\(\\) always exists and is not nullable\\.$#',
18+
'identifier' => 'isset.offset',
19+
'count' => 1,
20+
'path' => __DIR__ . '/src/Services/MeilisearchService.php',
21+
];
22+
23+
return ['parameters' => ['ignoreErrors' => $ignoreErrors]];

phpstan.dist.neon

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
includes:
2+
- phpstan-baseline.php
3+
14
parameters:
25
bootstrapFiles:
36
- vendor/bin/.phpunit/phpunit/vendor/autoload.php
47
level: 5
58
paths:
69
- src
710
- tests
8-
ignoreErrors:
9-
- '#Call to static method getClass\(\) on an unknown class Doctrine\\Common\\Util\\ClassUtils#'
10-
- '#Parameter \#1 \$array of function array_unique expects an array of values castable to string, list<class-string<Meilisearch\\Bundle\\Entity\\Aggregator>\|Meilisearch\\Bundle\\Entity\\Aggregator> given#'

0 commit comments

Comments
 (0)