diff --git a/src/Adapter/Builder/GcloudAdapterDefinitionBuilder.php b/src/Adapter/Builder/GcloudAdapterDefinitionBuilder.php index ac6fefc..8072736 100644 --- a/src/Adapter/Builder/GcloudAdapterDefinitionBuilder.php +++ b/src/Adapter/Builder/GcloudAdapterDefinitionBuilder.php @@ -45,6 +45,9 @@ protected function configureOptions(OptionsResolver $resolver): void $resolver->setDefault('prefix', ''); $resolver->setAllowedTypes('prefix', 'string'); + + $resolver->setDefault('visibility_handler', null); + $resolver->setAllowedTypes('visibility_handler', ['string', 'null']); } protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void @@ -53,8 +56,14 @@ protected function configureDefinition(Definition $definition, array $options, ? $bucketDefinition->setFactory([new Reference($options['client']), 'bucket']); $bucketDefinition->setArgument(0, $options['bucket']); + $visibilityHandlerReference = null; + if (null !== $options['visibility_handler']) { + $visibilityHandlerReference = new Reference($options['visibility_handler']); + } + $definition->setClass(GoogleCloudStorageAdapter::class); $definition->setArgument(0, $bucketDefinition); $definition->setArgument(1, $options['prefix']); + $definition->setArgument(2, $visibilityHandlerReference); } } diff --git a/src/DependencyInjection/Compiler/GcloudFactoryPass.php b/src/DependencyInjection/Compiler/GcloudFactoryPass.php new file mode 100644 index 0000000..5c1af15 --- /dev/null +++ b/src/DependencyInjection/Compiler/GcloudFactoryPass.php @@ -0,0 +1,31 @@ +register(PortableVisibilityHandler::class, PortableVisibilityHandler::class); + $container->setAlias('flysystem.adapter.gcloud.visibility.portable', PortableVisibilityHandler::class); + + $container->register(UniformBucketLevelAccessVisibility::class, UniformBucketLevelAccessVisibility::class); + $container->setAlias('flysystem.adapter.gcloud.visibility.uniform', UniformBucketLevelAccessVisibility::class); + } +} diff --git a/src/FlysystemBundle.php b/src/FlysystemBundle.php index 8451724..4bc27a0 100644 --- a/src/FlysystemBundle.php +++ b/src/FlysystemBundle.php @@ -11,6 +11,7 @@ namespace League\FlysystemBundle; +use League\FlysystemBundle\DependencyInjection\Compiler\GcloudFactoryPass; use League\FlysystemBundle\DependencyInjection\Compiler\LazyFactoryPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -30,5 +31,6 @@ public function build(ContainerBuilder $container): void parent::build($container); $container->addCompilerPass(new LazyFactoryPass()); + $container->addCompilerPass(new GcloudFactoryPass()); } } diff --git a/tests/Adapter/Builder/GcloudAdapterDefinitionBuilderTest.php b/tests/Adapter/Builder/GcloudAdapterDefinitionBuilderTest.php index 6b8b741..3d54487 100644 --- a/tests/Adapter/Builder/GcloudAdapterDefinitionBuilderTest.php +++ b/tests/Adapter/Builder/GcloudAdapterDefinitionBuilderTest.php @@ -12,6 +12,8 @@ namespace Tests\League\FlysystemBundle\Adapter\Builder; use League\Flysystem\GoogleCloudStorage\GoogleCloudStorageAdapter; +use League\Flysystem\GoogleCloudStorage\PortableVisibilityHandler; +use League\Flysystem\GoogleCloudStorage\UniformBucketLevelAccessVisibility; use League\FlysystemBundle\Adapter\Builder\GcloudAdapterDefinitionBuilder; use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\Definition; @@ -36,6 +38,18 @@ public function provideValidOptions(): \Generator 'bucket' => 'bucket', 'prefix' => 'prefix/path', ]]; + + yield 'portable visibility handler' => [[ + 'client' => 'my_client', + 'bucket' => 'bucket', + 'visibility_handler' => PortableVisibilityHandler::class, + ]]; + + yield 'uniform visibility handler' => [[ + 'client' => 'my_client', + 'bucket' => 'bucket', + 'visibility_handler' => UniformBucketLevelAccessVisibility::class, + ]]; } /** @@ -52,6 +66,7 @@ public function testOptionsBehavior() 'client' => 'my_client', 'bucket' => 'bucket_name', 'prefix' => 'prefix/path', + 'visibility_handler' => UniformBucketLevelAccessVisibility::class, ], null); $this->assertSame(GoogleCloudStorageAdapter::class, $definition->getClass()); @@ -65,5 +80,9 @@ public function testOptionsBehavior() $this->assertSame('bucket', $bucketDefinition->getFactory()[1]); $this->assertSame('prefix/path', $definition->getArgument(1)); + + /** @var Reference $visibilityHandlerReference */ + $visibilityHandlerReference = $definition->getArgument(2); + $this->assertInstanceOf(Reference::class, $visibilityHandlerReference); } }