Skip to content

Commit

Permalink
up
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniele Scibilia committed Oct 19, 2024
1 parent c400834 commit fe1a975
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 28 deletions.
20 changes: 8 additions & 12 deletions docs/Documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,27 +109,23 @@ namespace App\Services;
use Facile\MongoDbBundle\Services\UriOptions\UriOptionsInterface;
final class MyCustomUriOptionsProvider implements DriverOptionsInterface
final class MyCustomUriOptionsProvider implements UriOptionsInterface
{
/** @var string */
private $appname;
public function __construct(string $appname) {
$this->appname = $appname;
}
private const APPNAME = 'APPNAME';
public function buildDriverOptions(array $clientConfiguration) : array {
$clientConfiguration['appname'] = $this->appname;
return $clientConfiguration;
public function buildUriOptions(array $clientConfiguration): array
{
return array_merge(
$clientConfiguration,
['appname' => self::APPNAME]
);
}
}
```

```yaml
# config/services.yaml
App\Services\MyCustomUriOptionsProvider:
arguments:
$appname: 'APPNAME'
```

Then use its service id as value of `uriOptions` in the bundle configuration.
Expand Down
2 changes: 1 addition & 1 deletion phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ parameters:
ignoreErrors:
-
message: "#^Call to an undefined method Symfony\\\\Component\\\\Config\\\\Definition\\\\Builder\\\\NodeDefinition\\:\\:children\\(\\)\\.$#"
count: 7
count: 8
path: src/DependencyInjection/Configuration.php

-
Expand Down
19 changes: 6 additions & 13 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,12 @@ private function addClientsHosts(NodeBuilder $builder): void
->defaultValue(27_017);
}

private function addUriOptions(NodeBuilder $builder): void
{
$builder
->scalarNode('uriOptions');
}

private function addDriversOption(NodeBuilder $builder): void
{
$builder
Expand All @@ -133,17 +139,4 @@ private function addConnections(NodeBuilder $builder): void
->isRequired()
->info('Database name');
}

private function addUriOptions(NodeBuilder $builder): void
{
$uriOptionsBuilder = $builder
->arrayNode('uriOptions')
->info('Additional connection string options')
->children();

$uriOptionsBuilder
->variableNode('context')
->defaultValue([])
->info('Overwrite any options with the same name in the uri parameter');
}
}
10 changes: 9 additions & 1 deletion src/Services/ClientRegistry.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ private function buildClientConfiguration(array $conf): ClientConfiguration
'readPreference' => $conf['readPreference'],
];
if ($this->uriOptionsService instanceof UriOptionsInterface) {
$conf['options'] = $this->uriOptionsService->buildUriOptions($conf['uriOptions']);
$conf['uriOptions'] = $this->uriOptionsService->buildUriOptions($conf['uriOptions']);
}

$conf['driverOptions'] = [];
Expand Down Expand Up @@ -132,4 +132,12 @@ private function buildClient(string $clientName, string $uri, array $options, ar

return new Client($uri, $options, $driverOptions);
}

/**
* @return ClientConfiguration[]
*/
public function getConfigurations(): array
{
return $this->configurations;
}
}
2 changes: 1 addition & 1 deletion src/Services/UriOptions/UriOptionsInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
interface UriOptionsInterface
{
/**
* It creates an array of options for constructing a MongoDB\Client
* It creates an array of options for constructing a MongoDB\Client.
*
* @param array $clientConfiguration client's bundle configuration for which the options are needed
*
Expand Down
49 changes: 49 additions & 0 deletions tests/Unit/Services/ClientRegistryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Facile\MongoDbBundle\Tests\Unit\Services;

use Facile\MongoDbBundle\Services\UriOptions\UriOptionsInterface;
use Prophecy\PhpUnit\ProphecyTrait;
use Facile\MongoDbBundle\Event\ConnectionEvent;
use Facile\MongoDbBundle\Services\ClientRegistry;
Expand Down Expand Up @@ -96,6 +97,37 @@ public function test_client_connection_url_generation_multihost(): void
$this->assertEquals('mongodb://host1:8080,host2:8081', $client->__debugInfo()['uri']);
}

public function test_client_connection_url_generation_with_custom_uri_options(): void
{
$customUriOptions = ['appname' => 'APPNAME'];
$uriOptionsService = $this->getUriOptionsService($customUriOptions);
$registry = new ClientRegistry($this->createEventDispatcherMock(), false, $uriOptionsService, null);

$testConf = [
'test_client' => [
'hosts' => [],
'uri' => 'mongodb://user:password@host1:27017',
'username' => '',
'password' => '',
'authSource' => null,
'replicaSet' => 'testReplica',
'ssl' => true,
'connectTimeoutMS' => 3_000,
'readPreference' => 'primary',
],
];

$registry->addClientsConfigurations($testConf);
$client = $registry->getClient('test_client', 'testdb');

$this->assertEquals('mongodb://user:password@host1:27017', $client->__debugInfo()['uri']);
$this->assertEquals(['test_client.testdb'], $registry->getClientNames());
self::assertArrayHasKey('test_client', $registry->getConfigurations());
self::assertObjectHasProperty('options', $registry->getConfigurations()['test_client']);
self::assertArrayHasKey('appname', $registry->getConfigurations()['test_client']->getOptions());
$this->assertEquals('APPNAME', $registry->getConfigurations()['test_client']->getOptions()['appname']);
}

private function createEventDispatcherMock(): EventDispatcherInterface
{
$eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
Expand All @@ -113,4 +145,21 @@ private function createEventDispatcherMock(): EventDispatcherInterface

return $eventDispatcher->reveal();
}

private function getUriOptionsService($customUriOptions): UriOptionsInterface
{
return new class ($customUriOptions) implements UriOptionsInterface {
private array $customUriOptions;

public function __construct($customUriOptions)
{
$this->customUriOptions = $customUriOptions;
}

public function buildUriOptions(array $clientConfiguration): array
{
return array_merge($clientConfiguration, $this->customUriOptions);
}
};
}
}

0 comments on commit fe1a975

Please sign in to comment.