diff --git a/docs/6-gridfs.md b/docs/6-gridfs.md index 15746a8..8c6ebc4 100644 --- a/docs/6-gridfs.md +++ b/docs/6-gridfs.md @@ -27,7 +27,7 @@ flysystem: bucket: 'fs' ``` -## Full configuration +## With a Full Configuration To initialize the GridFS bucket from configuration, set the `mongodb_uri` and `database` options, others are optional. @@ -55,7 +55,7 @@ MONGODB_URI=mongodb://127.0.0.1:27017/ MONGODB_DB=flysystem ``` -## With bucket service +## With a Bucket Service For a more advanced configuration, create a service for [`MongoDB\GridFS\Bucket`](https://www.mongodb.com/docs/php-library/current/tutorial/gridfs/): diff --git a/src/Adapter/Builder/GridFSAdapterDefinitionBuilder.php b/src/Adapter/Builder/GridFSAdapterDefinitionBuilder.php index dfc1f1d..cb6be84 100644 --- a/src/Adapter/Builder/GridFSAdapterDefinitionBuilder.php +++ b/src/Adapter/Builder/GridFSAdapterDefinitionBuilder.php @@ -56,29 +56,34 @@ protected function configureOptions(OptionsResolver $resolver): void protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void { if (isset($options['doctrine_connection'])) { - $bucketDefinition = new Definition(Bucket::class); - $bucketDefinition->setFactory([self::class, 'initializeBucketFromDocumentManager']); - $bucketDefinition->setArguments([ + if (isset($options['mongodb_uri'])) { + throw new InvalidArgumentException('In GridFS configuration, "doctrine_connection" and "mongodb_uri" options cannot be set together.'); + } + $bucket = new Definition(Bucket::class); + $bucket->setFactory([self::class, 'initializeBucketFromDocumentManager']); + $bucket->setArguments([ new Reference(sprintf('doctrine_mongodb.odm.%s_document_manager', $options['doctrine_connection'])), $options['database'], $options['bucket'], ]); } elseif (isset($options['mongodb_uri'])) { - $bucketDefinition = new Definition(Bucket::class); - $bucketDefinition->setFactory([self::class, 'initializeBucketFromConfig']); - $bucketDefinition->setArguments([ + $bucket = new Definition(Bucket::class); + $bucket->setFactory([self::class, 'initializeBucketFromConfig']); + $bucket->setArguments([ $options['mongodb_uri'], $options['mongodb_uri_options'], $options['mongodb_driver_options'], $options['database'] ?? throw new InvalidArgumentException('MongoDB "database" name is required for Flysystem GridFS configuration'), $options['bucket'], ]); - } elseif (!$options['bucket']) { + } elseif ($options['bucket']) { + $bucket = new Reference($options['bucket']); + } else { throw new InvalidArgumentException('Flysystem GridFS configuration requires a "bucket" service name, a "mongodb_uri" or a "doctrine_connection" name'); } $definition->setClass(GridFSAdapter::class); - $definition->setArgument(0, $bucketDefinition ?? new Reference($options['bucket'])); + $definition->setArgument(0, $bucket); $definition->setArgument(1, $options['prefix']); } diff --git a/tests/Adapter/Builder/GridFSAdapterDefinitionBuilderTest.php b/tests/Adapter/Builder/GridFSAdapterDefinitionBuilderTest.php index 0c1d9e3..8f82cb3 100644 --- a/tests/Adapter/Builder/GridFSAdapterDefinitionBuilderTest.php +++ b/tests/Adapter/Builder/GridFSAdapterDefinitionBuilderTest.php @@ -18,6 +18,7 @@ use MongoDB\Client; use MongoDB\GridFS\Bucket; use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; class GridFSAdapterDefinitionBuilderTest extends TestCase { @@ -64,6 +65,37 @@ public function testCreateDefinition($options) $this->assertSame(GridFSAdapter::class, $this->createBuilder()->createDefinition($options, null)->getClass()); } + public function provideInvalidOptions() + { + yield 'empty' => [ + [], + 'Flysystem GridFS configuration requires a "bucket" service name, a "mongodb_uri" or a "doctrine_connection" name', + ]; + + yield 'no database with mongodb_uri' => [ + ['mongodb_uri' => 'mongodb://127.0.0.1:27017/'], + 'MongoDB "database" name is required for Flysystem GridFS configuration' + ]; + + yield 'both doctrine_connection and mongodb_uri' => [ + ['doctrine_connection' => 'default', 'mongodb_uri' => 'mongodb://127.0.0.1:27017/'], + 'In GridFS configuration, "doctrine_connection" and "mongodb_uri" options cannot be set together.' + ]; + } + + /** + * @dataProvider provideInvalidOptions + */ + public function testInvalidOptions(array $options, string $message) + { + $builder = $this->createBuilder(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage($message); + + $builder->createDefinition($options, null); + } + public function testInitializeBucketFromDocumentManager() { $client = new Client();