Skip to content

Commit 35160cf

Browse files
author
Frank Verschuren
committed
feat(elasticsearch): re-introduce v7 support
1 parent 9389b4f commit 35160cf

File tree

9 files changed

+36
-10
lines changed

9 files changed

+36
-10
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
"doctrine/mongodb-odm": "^2.6",
128128
"doctrine/mongodb-odm-bundle": "^4.0 || ^5.0",
129129
"doctrine/orm": "^2.17 || ^3.0",
130-
"elasticsearch/elasticsearch": "^8.4",
130+
"elasticsearch/elasticsearch": "^7.17 || ^8.4",
131131
"friends-of-behat/mink-browserkit-driver": "^1.3.1",
132132
"friends-of-behat/mink-extension": "^2.2",
133133
"friends-of-behat/symfony-extension": "^2.1",

src/Elasticsearch/State/CollectionProvider.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
use Elastic\Elasticsearch\Client;
2525
use Elastic\Elasticsearch\Exception\ClientResponseException;
2626
use Elastic\Elasticsearch\Response\Elasticsearch;
27+
use Elasticsearch\Client as V7Client;
28+
use Elasticsearch\Common\Exceptions\Missing404Exception as V7Missing404Exception;
2729
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
2830

2931
/**
@@ -37,7 +39,7 @@ final class CollectionProvider implements ProviderInterface
3739
/**
3840
* @param RequestBodySearchCollectionExtensionInterface[] $collectionExtensions
3941
*/
40-
public function __construct(private readonly Client $client, private readonly ?DenormalizerInterface $denormalizer = null, private readonly ?Pagination $pagination = null, private readonly iterable $collectionExtensions = [], private readonly ?InflectorInterface $inflector = new Inflector())
42+
public function __construct(private readonly V7Client|Client $client, private readonly ?DenormalizerInterface $denormalizer = null, private readonly ?Pagination $pagination = null, private readonly iterable $collectionExtensions = [], private readonly ?InflectorInterface $inflector = new Inflector())
4143
{
4244
}
4345

@@ -69,12 +71,14 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
6971

7072
try {
7173
$documents = $this->client->search($params);
74+
} catch (V7Missing404Exception $e) {
75+
throw new Error(status: $e->getCode(), detail: $e->getMessage(), title: $e->getMessage(), originalTrace: $e->getTrace());
7276
} catch (ClientResponseException $e) {
7377
$response = $e->getResponse();
7478
throw new Error(status: $response->getStatusCode(), detail: (string) $response->getBody(), title: $response->getReasonPhrase(), originalTrace: $e->getTrace());
7579
}
7680

77-
if ($documents instanceof Elasticsearch) {
81+
if (class_exists(Elastic\Elasticsearch\Response\Elasticsearch::class) && $documents instanceof Elasticsearch) {
7882
$documents = $documents->asArray();
7983
}
8084

src/Elasticsearch/State/ItemProvider.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
use Elastic\Elasticsearch\Client;
2424
use Elastic\Elasticsearch\Exception\ClientResponseException;
2525
use Elastic\Elasticsearch\Response\Elasticsearch;
26+
use Elasticsearch\Client as V7Client;
27+
use Elasticsearch\Common\Exceptions\Missing404Exception as V7Missing404Exception;
2628
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
2729
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
2830

@@ -34,7 +36,7 @@
3436
*/
3537
final class ItemProvider implements ProviderInterface
3638
{
37-
public function __construct(private readonly Client $client, private readonly ?DenormalizerInterface $denormalizer = null, private readonly ?InflectorInterface $inflector = new Inflector())
39+
public function __construct(private readonly V7Client|Client $client, private readonly ?DenormalizerInterface $denormalizer = null, private readonly ?InflectorInterface $inflector = new Inflector())
3840
{
3941
}
4042

@@ -56,6 +58,8 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
5658

5759
try {
5860
$document = $this->client->get($params);
61+
} catch (V7Missing404Exception) {
62+
return null;
5963
} catch (ClientResponseException $e) {
6064
$response = $e->getResponse();
6165
if (404 === $response->getStatusCode()) {
@@ -65,7 +69,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
6569
throw new Error(status: $response->getStatusCode(), detail: (string) $response->getBody(), title: $response->getReasonPhrase(), originalTrace: $e->getTrace());
6670
}
6771

68-
if ($document instanceof Elasticsearch) {
72+
if (class_exists(Elastic\Elasticsearch\Response\Elasticsearch::class) && $documents instanceof Elasticsearch) {
6973
$document = $document->asArray();
7074
}
7175

src/Elasticsearch/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"api-platform/metadata": "^3.4 || ^4.0",
2828
"api-platform/serializer": "^3.4 || ^4.0",
2929
"api-platform/state": "^3.4 || ^4.0",
30-
"elasticsearch/elasticsearch": "^8.4",
30+
"elasticsearch/elasticsearch": "^7.17 || ^8.4",
3131
"symfony/cache": "^6.4 || ^7.0",
3232
"symfony/console": "^6.4 || ^7.0",
3333
"symfony/property-access": "^6.4 || ^7.0",

src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,11 @@ private function registerElasticsearchConfiguration(ContainerBuilder $container,
810810
return;
811811
}
812812

813-
$clientClass = class_exists(\Elasticsearch\Client::class) ? \Elasticsearch\Client::class : \Elastic\Elasticsearch\Client::class;
813+
$clientClass = class_exists(\Elasticsearch\Client::class)
814+
// ES v8 and up
815+
? \Elasticsearch\Client::class
816+
// ES v7
817+
: \Elastic\Elasticsearch\Client::class;
814818

815819
$clientDefinition = new Definition($clientClass);
816820
$container->setDefinition('api_platform.elasticsearch.client', $clientDefinition);

src/Symfony/Bundle/DependencyInjection/Compiler/ElasticsearchClientPass.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ public function process(ContainerBuilder $container): void
4040
}
4141

4242
if (class_exists(\Elasticsearch\ClientBuilder::class)) {
43+
// ES v7
4344
$builderName = \Elasticsearch\ClientBuilder::class;
4445
} else {
46+
// ES v8 and up
4547
$builderName = \Elastic\Elasticsearch\ClientBuilder::class;
4648
}
4749

src/Symfony/Bundle/DependencyInjection/Configuration.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,12 @@ private function addElasticsearchSection(ArrayNodeDefinition $rootNode): void
468468
->validate()
469469
->ifTrue()
470470
->then(static function (bool $v): bool {
471-
if (!(class_exists(\Elasticsearch\Client::class) || class_exists(\Elastic\Elasticsearch\Client::class))) {
471+
if (
472+
// ES v8 and up
473+
!class_exists(\Elasticsearch\Client::class)
474+
// ES v7
475+
&& !class_exists(\Elastic\Elasticsearch\Client::class)
476+
) {
472477
throw new InvalidConfigurationException('The elasticsearch/elasticsearch package is required for Elasticsearch support.');
473478
}
474479

tests/Behat/ElasticsearchContext.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use Behat\Behat\Context\Context;
1717
use Elastic\Elasticsearch\Client;
18+
use Elasticsearch\Client as V7Client;
1819
use Symfony\Component\Finder\Finder;
1920

2021
/**
@@ -24,7 +25,7 @@
2425
*/
2526
final class ElasticsearchContext implements Context
2627
{
27-
public function __construct(private readonly Client $client, private readonly string $elasticsearchMappingsPath, private readonly string $elasticsearchFixturesPath)
28+
public function __construct(private readonly V7Client|Client $client, private readonly string $elasticsearchMappingsPath, private readonly string $elasticsearchFixturesPath)
2829
{
2930
}
3031

tests/Symfony/Bundle/DependencyInjection/Compiler/ElasticsearchClientPassTest.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public function testConstruct(): void
3636

3737
public function testProcess(): void
3838
{
39+
// ES v7
3940
if (class_exists(\Elasticsearch\ClientBuilder::class)) {
4041
$clientBuilder = \Elasticsearch\ClientBuilder::class;
4142

@@ -45,6 +46,7 @@ public function testProcess(): void
4546
Argument::withEntry('tracer', Argument::type(Reference::class)),
4647
Argument::size(3),
4748
];
49+
// ES v8 and up
4850
} else {
4951
$clientBuilder = \Elastic\Elasticsearch\ClientBuilder::class;
5052

@@ -75,7 +77,11 @@ public function testProcess(): void
7577

7678
public function testProcessWithoutConfiguration(): void
7779
{
78-
$clientBuilder = class_exists(\Elasticsearch\ClientBuilder::class) ? \Elasticsearch\ClientBuilder::class : \Elastic\Elasticsearch\ClientBuilder::class;
80+
$clientBuilder = class_exists(\Elasticsearch\ClientBuilder::class)
81+
// ES v7
82+
? \Elasticsearch\ClientBuilder::class
83+
// ES v8 and up
84+
: \Elastic\Elasticsearch\ClientBuilder::class;
7985

8086
$clientDefinitionProphecy = $this->prophesize(Definition::class);
8187
$clientDefinitionProphecy->setFactory([$clientBuilder, 'build'])->willReturn($clientDefinitionProphecy->reveal())->shouldBeCalled();

0 commit comments

Comments
 (0)