diff --git a/composer.json b/composer.json index ae089f3..02eaf02 100644 --- a/composer.json +++ b/composer.json @@ -37,6 +37,7 @@ "league/flysystem-async-aws-s3": "^2.0", "league/flysystem-aws-s3-v3": "^2.0", "league/flysystem-ftp": "^2.0", + "league/flysystem-google-cloud-storage": "^2.0", "league/flysystem-memory": "^2.0", "league/flysystem-sftp": "^2.0", "phpstan/phpstan": "^0.12.10", @@ -56,6 +57,7 @@ "ext-ftp": "Required for FTP and SFTP", "league/flysystem-async-aws-s3": "Use flysystem S3 adapter from AsyncAws", "league/flysystem-aws-s3-v3": "Use S3 storage with AWS SDK v3", + "league/flysystem-google-cloud-storage": "Use Google Cloud Storage Adapter for Flysystem", "league/flysystem-sftp": "Allows SFTP server storage via phpseclib", "royvoetman/flysystem-gitlab-storage": "Use Gitlab Storage filesystem for Flysystem" }, diff --git a/doc/adapter_google_cloud_storage.md b/doc/adapter_google_cloud_storage.md new file mode 100644 index 0000000..8c4c813 --- /dev/null +++ b/doc/adapter_google_cloud_storage.md @@ -0,0 +1,20 @@ +# Use the Google Cloud Storage adapter + +This adapter connects to the filesystem in the Google Cloud Storage. + + +```yml +oneup_flysystem: + adapters: + acme.flysystem_adapter: + googlecloudstorage: + client: 'google_cloud_storage_client' # Service ID of the Google\Cloud\Storage\StorageClient + bucket: 'my_gcs_bucket' + prefix: '' +``` + +For more details on the other parameters, take a look at the [Flysystem documentation](https://flysystem.thephpleague.com/v2/docs/adapter/gcs/). + +## More to know + +* [Create and use your filesystem](filesystem_create.md) diff --git a/src/DependencyInjection/Factory/Adapter/GoogleCloudStorageFactory.php b/src/DependencyInjection/Factory/Adapter/GoogleCloudStorageFactory.php new file mode 100644 index 0000000..73db0c1 --- /dev/null +++ b/src/DependencyInjection/Factory/Adapter/GoogleCloudStorageFactory.php @@ -0,0 +1,49 @@ +setFactory([new Reference($config['client']), 'bucket']); + $bucket->setArgument(0, $config['bucket']); + + $container + ->setDefinition($id, new ChildDefinition('oneup_flysystem.adapter.googlecloudstorage')) + ->replaceArgument(0, $bucket) + ->replaceArgument(1, $config['prefix']) + ->replaceArgument(2, $config['visibilityHandler']) + ->replaceArgument(3, $config['defaultVisiblity']) + ; + } + + public function addConfiguration(NodeDefinition $node): void + { + $node + ->children() + ->scalarNode('client')->isRequired()->end() + ->scalarNode('bucket')->isRequired()->end() + ->scalarNode('prefix')->treatNullLike('')->defaultValue('')->end() + ->scalarNode('visibilityHandler')->defaultNull()->end() + ->scalarNode('defaultVisiblity')->defaultValue(Visibility::PRIVATE)->end() + ->end() + ; + } +} diff --git a/src/Resources/config/adapters.xml b/src/Resources/config/adapters.xml index 4cbbb0d..a38e828 100644 --- a/src/Resources/config/adapters.xml +++ b/src/Resources/config/adapters.xml @@ -41,6 +41,13 @@ + + + + + + + diff --git a/src/Resources/config/factories.xml b/src/Resources/config/factories.xml index d9c38e0..01923a4 100644 --- a/src/Resources/config/factories.xml +++ b/src/Resources/config/factories.xml @@ -32,6 +32,10 @@ class="Oneup\FlysystemBundle\DependencyInjection\Factory\Adapter\AsyncAwsS3Factory"> + + + diff --git a/tests/App/config/config.yml b/tests/App/config/config.yml index b167863..2045807 100644 --- a/tests/App/config/config.yml +++ b/tests/App/config/config.yml @@ -1,3 +1,15 @@ +services: + _defaults: + autowire: true + autoconfigure: true + + Oneup\FlysystemBundle\Tests\DependencyInjection\TestService: + public: true + + google_cloud_storage_client: + class: Google\Cloud\Storage\StorageClient + + framework: translator: { fallback: en } secret: secret @@ -39,6 +51,12 @@ oneup_flysystem: connectionProvider: 'test' root: 'test' + googlecloudstorage: + googlecloudstorage: + client: 'google_cloud_storage_client' + bucket: 'test' + prefix: 'prefix' + filesystems: myfilesystem: adapter: local @@ -51,10 +69,5 @@ oneup_flysystem: adapter: local visibility: private -services: - _defaults: - autowire: true - autoconfigure: true - - Oneup\FlysystemBundle\Tests\DependencyInjection\TestService: - public: true + myfilesystem4: + adapter: googlecloudstorage diff --git a/tests/DependencyInjection/OneupFlysystemExtensionTest.php b/tests/DependencyInjection/OneupFlysystemExtensionTest.php index c296240..65a4568 100644 --- a/tests/DependencyInjection/OneupFlysystemExtensionTest.php +++ b/tests/DependencyInjection/OneupFlysystemExtensionTest.php @@ -60,6 +60,10 @@ public function testAdapterAvailability(): void $adapters = simplexml_load_string((string) file_get_contents(__DIR__ . '/../../src/Resources/config/adapters.xml')); foreach ($adapters->children()->children() as $service) { + if (null === $service->attributes()) { + continue; + } + foreach ($service->attributes() as $key => $attribute) { if ('class' === (string) $key) { self::assertTrue(class_exists((string) $attribute), 'Could not load class: ' . $attribute); @@ -143,6 +147,11 @@ public function testServiceAliasInjection(): void self::assertInstanceOf(Filesystem::class, $testService->filesystem); } + public function testGoogleCloudAdapter(): void + { + $this->assertInstanceOf(Filesystem::class, self::$container->get('oneup_flysystem.myfilesystem4_filesystem')); + } + private function loadExtension(array $config): ContainerBuilder { $extension = new OneupFlysystemExtension();