Symfony two AWS_S3 configuration

Viewed 140

In my project on Symfony 5, I need to have two different AWS_S3 config.

Steps I done so fare:

  1. Created class "NewFileSystem" that Extended Base class FileSystem.
<?php

namespace App\Factory;

use League\Flysystem\Filesystem;

class NewFileSystem extends Filesystem
{
}
  1. Added configuration in services.yaml
services:
    usr_data.s3_client:
        class: Aws\S3\S3Client
        arguments:
        -
            version: 'latest'
            region: "%env(AWS_S3_REGION)%"
            credentials:
                key: "%env(AWS_S3_KEY)%"
                secret: "%env(AWS_S3_SECRET)%"

    usr_data.s3_legacy_client:
        class: Aws\S3\S3Client
        arguments:
            - version: 'latest'
              region: "%env(AWS_S3_LEGACY_REGION)%"
              credentials:
                  key: "%env(AWS_S3_LEGACY_KEY)%"
                  secret: "%env(AWS_S3_LEGACY_SECRET)%"

    League\Flysystem\Filesystem: "@oneup_flysystem.s3_filesystem_filesystem"
    App\Factory\NewFileSystem: "@oneup_flysystem.s3_legacy_filesystem"
  1. Added configuration in oneup_flysystem.yaml
oneup_flysystem:
    adapters:
        default_adapter:
            local:
                directory: '%kernel.root_dir%/../data/invoice-attachment'
        tutorial_adapter:
            local:
                directory: '%kernel.root_dir%/../public/assets/tutorial'
        permissions_adapter:
            local:
                directory: '%kernel.root_dir%/../public/assets/permissions'
        images_adapter:
            local:
                directory: '%kernel.root_dir%/../public/assets/images'
        awsS3_adapter_usr_data:
            awss3v3:
                client: usr_data.s3_client
                bucket: "%env(AWS_S3_UPLOAD_BUCKET)%"
                prefix: ~
        awsS3_legacy_usr_data:
            awss3v3:
                client: usr_data.s3_legacy_client
                bucket: "%env(AWS_S3_LEGACY_UPLOAD_BUCKET)%"
                prefix: ~
    filesystems:
        default_filesystem:
            adapter: default_adapter
            alias: my_filesystem
        tutorial_filesystem:
            adapter: tutorial_adapter
        permissions_filesystem:
            adapter: permissions_adapter
        images_filesystem:
            adapter: images_adapter
        s3_filesystem:
            adapter: awsS3_adapter_usr_data
            alias: League\Flysystem\Filesystem
        s3_legacy:
            adapter: awsS3_legacy_usr_data
            alias: App\Factory\NewFileSystem
  1. Inject new class by dependency injection in controller
    public function createAction(Request $request, NewFileSystem $fileSystem): BaseOutput
    {
        dd($fileSystem);
    }

And I have following error.

Argument 2 passed to App\Controller\Api\Migration\ProcessController::createAction() must be an instance of App\Factory\NewFileSystem, instance of League\Flysystem\Filesystem given

Why system doesn't want inject class "NewFileSystem". What else should I configured to have a new class with different s3 configuration.

Thank you.

1 Answers

I think you messed up a bit the way you try to inject your filesystem to the controller. According to TheLeague documenation and also to OneUp documentation, and assuming you use autowiring:

your service definition should be rather changed to :

oneup_flysystem:
    adapters:
        default_adapter:
            local:
                directory: '%kernel.root_dir%/../data/invoice-attachment'
        tutorial_adapter:
            local:
                directory: '%kernel.root_dir%/../public/assets/tutorial'
        permissions_adapter:
            local:
                directory: '%kernel.root_dir%/../public/assets/permissions'
        images_adapter:
            local:
                directory: '%kernel.root_dir%/../public/assets/images'
        awsS3_adapter_usr_data:
            awss3v3:
                client: usr_data.s3_client
                bucket: "%env(AWS_S3_UPLOAD_BUCKET)%"
                prefix: ~
        awsS3_legacy_usr_data:
            awss3v3:
                client: usr_data.s3_legacy_client
                bucket: "%env(AWS_S3_LEGACY_UPLOAD_BUCKET)%"
                prefix: ~
    filesystems:
        default_filesystem:
            adapter: default_adapter
            alias: my_filesystem
        tutorial_filesystem:
            adapter: tutorial_adapter
        permissions_filesystem:
            adapter: permissions_adapter
        images_filesystem:
            adapter: images_adapter
        s3_filesystem:
            adapter: awsS3_adapter_usr_data
            alias: League\Flysystem\Filesystem
        s3_legacy:
            adapter: awsS3_legacy_usr_data
            # mind the change here <<<<<<<<<<<<<<
            alias: s3_legacy_filesystem

and your controller's code should look like this:

use League\Flysystem\FilesystemOperator;
{
//...
    // The variable name $s3LegacyFilesystem matters
    public function createAction(Request $request, FilesystemOperator $s3LegacyFilesystem)
    {
        // ...
    }
}

And you don't need anymore the entire NewFileSystem class now.
Related