Skip to content

Commit ac2ecc0

Browse files
committed
Validate that mongodb_uri is not set with doctrine_connection
1 parent 581ee74 commit ac2ecc0

File tree

3 files changed

+47
-10
lines changed

3 files changed

+47
-10
lines changed

docs/6-gridfs.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ flysystem:
2727
bucket: 'fs'
2828
```
2929
30-
## Full configuration
30+
## With a Full Configuration
3131
3232
To initialize the GridFS bucket from configuration, set the `mongodb_uri` and `database` options, others are optional.
3333

@@ -55,7 +55,7 @@ MONGODB_URI=mongodb://127.0.0.1:27017/
5555
MONGODB_DB=flysystem
5656
```
5757

58-
## With bucket service
58+
## With a Bucket Service
5959

6060
For a more advanced configuration, create a service for
6161
[`MongoDB\GridFS\Bucket`](https://www.mongodb.com/docs/php-library/current/tutorial/gridfs/):

src/Adapter/Builder/GridFSAdapterDefinitionBuilder.php

+13-8
Original file line numberDiff line numberDiff line change
@@ -56,29 +56,34 @@ protected function configureOptions(OptionsResolver $resolver): void
5656
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
5757
{
5858
if (isset($options['doctrine_connection'])) {
59-
$bucketDefinition = new Definition(Bucket::class);
60-
$bucketDefinition->setFactory([self::class, 'initializeBucketFromDocumentManager']);
61-
$bucketDefinition->setArguments([
59+
if (isset($options['mongodb_uri'])) {
60+
throw new InvalidArgumentException('In GridFS configuration, "doctrine_connection" and "mongodb_uri" options cannot be set together.');
61+
}
62+
$bucket = new Definition(Bucket::class);
63+
$bucket->setFactory([self::class, 'initializeBucketFromDocumentManager']);
64+
$bucket->setArguments([
6265
new Reference(sprintf('doctrine_mongodb.odm.%s_document_manager', $options['doctrine_connection'])),
6366
$options['database'],
6467
$options['bucket'],
6568
]);
6669
} elseif (isset($options['mongodb_uri'])) {
67-
$bucketDefinition = new Definition(Bucket::class);
68-
$bucketDefinition->setFactory([self::class, 'initializeBucketFromConfig']);
69-
$bucketDefinition->setArguments([
70+
$bucket = new Definition(Bucket::class);
71+
$bucket->setFactory([self::class, 'initializeBucketFromConfig']);
72+
$bucket->setArguments([
7073
$options['mongodb_uri'],
7174
$options['mongodb_uri_options'],
7275
$options['mongodb_driver_options'],
7376
$options['database'] ?? throw new InvalidArgumentException('MongoDB "database" name is required for Flysystem GridFS configuration'),
7477
$options['bucket'],
7578
]);
76-
} elseif (!$options['bucket']) {
79+
} elseif ($options['bucket']) {
80+
$bucket = new Reference($options['bucket']);
81+
} else {
7782
throw new InvalidArgumentException('Flysystem GridFS configuration requires a "bucket" service name, a "mongodb_uri" or a "doctrine_connection" name');
7883
}
7984

8085
$definition->setClass(GridFSAdapter::class);
81-
$definition->setArgument(0, $bucketDefinition ?? new Reference($options['bucket']));
86+
$definition->setArgument(0, $bucket);
8287
$definition->setArgument(1, $options['prefix']);
8388
}
8489

tests/Adapter/Builder/GridFSAdapterDefinitionBuilderTest.php

+32
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use MongoDB\Client;
1919
use MongoDB\GridFS\Bucket;
2020
use PHPUnit\Framework\TestCase;
21+
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
2122

2223
class GridFSAdapterDefinitionBuilderTest extends TestCase
2324
{
@@ -64,6 +65,37 @@ public function testCreateDefinition($options)
6465
$this->assertSame(GridFSAdapter::class, $this->createBuilder()->createDefinition($options, null)->getClass());
6566
}
6667

68+
public function provideInvalidOptions()
69+
{
70+
yield 'empty' => [
71+
[],
72+
'Flysystem GridFS configuration requires a "bucket" service name, a "mongodb_uri" or a "doctrine_connection" name',
73+
];
74+
75+
yield 'no database with mongodb_uri' => [
76+
['mongodb_uri' => 'mongodb://127.0.0.1:27017/'],
77+
'MongoDB "database" name is required for Flysystem GridFS configuration'
78+
];
79+
80+
yield 'both doctrine_connection and mongodb_uri' => [
81+
['doctrine_connection' => 'default', 'mongodb_uri' => 'mongodb://127.0.0.1:27017/'],
82+
'In GridFS configuration, "doctrine_connection" and "mongodb_uri" options cannot be set together.'
83+
];
84+
}
85+
86+
/**
87+
* @dataProvider provideInvalidOptions
88+
*/
89+
public function testInvalidOptions(array $options, string $message)
90+
{
91+
$builder = $this->createBuilder();
92+
93+
$this->expectException(InvalidArgumentException::class);
94+
$this->expectExceptionMessage($message);
95+
96+
$builder->createDefinition($options, null);
97+
}
98+
6799
public function testInitializeBucketFromDocumentManager()
68100
{
69101
$client = new Client();

0 commit comments

Comments
 (0)