2017 © Pedro Peláez
 

library psr11-flysystem

Flysystem Facotories for PSR-11

image

wshafer/psr11-flysystem

Flysystem Facotories for PSR-11

  • Friday, September 15, 2017
  • by wshafer
  • Repository
  • 1 Watchers
  • 4 Stars
  • 55 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 2 Forks
  • 1 Open issues
  • 11 Versions
  • 22 % Grown

The README.md

codecov Scrutinizer Code Quality Build Status, (*1)

PSR-11 FlySystem

FlySystem Version 1 Factories for PSR-11, (*2)

Deprecated

This library has been depricated and moved. Please see the new module blazon/psr11-flysystem for the latest release., (*3)

Table of Contents

Installation

composer require wshafer/psr11-flysystem

Usage

<?php

// Get the FlySystem FileSystem
$fileSystem = $container->get('myFileSystemService');

// Write to file
$fileSystem->put('test.txt', 'this is test');

Additional info can be found in the documentation, (*4)

Containers

Any PSR-11 container wil work. In order to do that you will need to add configuration and register a new service that points to WShafer\PSR11FlySystem\FlySystemFactory, (*5)

Below are some specific container examples to get you started, (*6)

Pimple Example

// Create Container
$container = new \Xtreamwayz\Pimple\Container([
    // FlySystem using the default keys.
    'fileSystem' => new \WShafer\PSR11FlySystem\FlySystemFactory(),

    // FlySystem using a different filesystem configuration
    'other' => function($c) {
        return \WShafer\PSR11FlySystem\FlySystemFactory::other($c);
    },

    // Config
    'config' => [
        'flysystem' => [
            'adaptors' => [
                // At the bare minimum you must include a default adaptor.
                'default' => [  
                    'type' => 'local',
                    'options' => [
                        'root' => '/tmp/pimple'
                    ],
                ],

                // Some other Adaptor.  Keys are the names for each adaptor
                'someOtherAdaptor' => [
                    'type' => 'local',
                    'options' => [
                        'root' => '/tmp/pimple'
                    ],
                ],
            ],

            'fileSystems' => [
                'other' => [
                    'adaptor' => 'someOtherAdaptor'
                ],
            ],
        ],
    ]
]);

/** @var \League\Flysystem\FilesystemInterface $fileSystem */
$fileSystem = $container->get('other');
$fileSystem->put('test1.txt', 'this is a test');
print $fileSystem->get('test1.txt')->read();

Zend Service Manager

// Create the container and define the services you'd like to use
$container = new \Zend\ServiceManager\ServiceManager([
    'factories' => [
        // FlySystem using the default keys.
        'fileSystem' => \WShafer\PSR11FlySystem\FlySystemFactory::class,

        // FlySystem using a different filesystem configuration
        'other' => [\WShafer\PSR11FlySystem\FlySystemFactory::class, 'other'],
    ],
]);

// Config
$container->setService('config', [
    'flysystem' => [
        'adaptors' => [
            // At the bare minimum you must include a default adaptor.
            'default' => [  
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/zend'
                ],
            ],

            // Some other Adaptor.  Keys are the names for each adaptor
            'someOtherAdaptor' => [
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/zend'
                ],
            ],
        ],

        'fileSystems' => [
            'other' => [
                'adaptor' => 'someOtherAdaptor'
            ],
        ],
    ],
]);

/** @var \League\Flysystem\FilesystemInterface $fileSystem */
$fileSystem = $container->get('other');
$fileSystem->put('test1.txt', 'this is a test');
print $fileSystem->get('test1.txt')->read();

Frameworks

Any framework that use a PSR-11 should work fine. Below are some specific framework examples to get you started, (*7)

Zend Expressive

You'll need to add configuration and register the services you'd like to use. There are number of ways to do that but the recommended way is to create a new config file config/autoload/flySystem.global.php, (*8)

Configuration

config/autoload/flySystem.global.php, (*9)

<?php
return [
    'dependencies' => [
        'factories' => [
            // FlySystem using the default keys.
            'fileSystem' => \WShafer\PSR11FlySystem\FlySystemFactory::class,

            // FlySystem using a different filesystem configuration
            'other' => [\WShafer\PSR11FlySystem\FlySystemFactory::class, 'other'],
        ],
    ],

    'flysystem' => [
        'adaptors' => [
            // At the bare minimum you must include a default adaptor.
            'default' => [  
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/zend'
                ],
            ],

            // Some other Adaptor.  Keys are the names for each adaptor
            'someOtherAdaptor' => [
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/zend'
                ],
            ],
        ],

        'fileSystems' => [
            'other' => [
                'adaptor' => 'someOtherAdaptor'
            ],
        ],
    ],
];

Zend Framework 3

You'll need to add configuration and register the services you'd like to use. There are number of ways to do that but the recommended way is to create a new config file config/autoload/flySystem.global.php, (*10)

Configuration

config/autoload/flySystem.global.php, (*11)

<?php
return [
    'service_manager' => [
        'factories' => [
            // FlySystem using the default keys.
            'fileSystem' => \WShafer\PSR11FlySystem\FlySystemFactory::class,

            // FlySystem using a different filesystem configuration
            'other' => [\WShafer\PSR11FlySystem\FlySystemFactory::class, 'other'],
        ],
    ],

    'flysystem' => [
        'adaptors' => [
            // At the bare minimum you must include a default adaptor.
            'default' => [  
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/zend'
                ],
            ],

            // Some other Adaptor.  Keys are the names for each adaptor
            'someOtherAdaptor' => [
                'type' => 'local',
                'options' => [
                    'root' => '/tmp/zend'
                ],
            ],
        ],

        'fileSystems' => [
            'other' => [
                'adaptor' => 'someOtherAdaptor'
            ],
        ],
    ],
];

Module Config

If you're not using the Zend Component Installer you will also need to register the Module., (*12)

config/modules.config.php (ZF 3 skeleton), (*13)

<?php

return [
    // ... Previously registered modules here
    'WShafer\\PSR11FlySystem',
];

config/application.config.php (ZF 2 skeleton), (*14)

<?php

return [
    'modules' => [
        // ... Previously registered modules here
        'WShafer\\PSR11FlySystem',
    ]
];

Symfony

While there are other Symfony bundles out there, as of Symfony 3.3 the service container is now a PSR-11 compatible container. The following config below will get these factories registered and working in Symfony., (*15)

Configuration

app/config/config.yml (or equivalent), (*16)

parameters:
    flysystem:
        adaptors:
            # At the bare minimum you must include a default adaptor.
            default:
                type: local
                options:
                    root: /tmp/symfony

            # Some other Adaptor.  Keys are the names for each adaptor
            someOtherAdaptor:
                type: local
                options:
                    root: /tmp/symfony

        fileSystems:
            other:
                adaptor: someOtherAdaptor

Container Service Config

app/config/services.yml, (*17)

services:
    # FlySystem using the default keys.
    fileSystem:
        factory: 'WShafer\PSR11FlySystem\FlySystemFactory:__invoke'
        class: 'League\Flysystem\FilesystemInterface'
        arguments: ['@service_container']
        public: true

    # FlySystem using a different filesystem configuration
    other:
        factory: ['WShafer\PSR11FlySystem\FlySystemFactory', __callStatic]
        class: 'League\Flysystem\FilesystemInterface'
        arguments: ['other', ['@service_container']]
        public: true

    WShafer\PSR11FlySystem\FlySystemFactory:
        class: 'WShafer\PSR11FlySystem\FlySystemFactory'
        public: true

Example Usage

src/AppBundle/Controller/DefaultController.php, (*18)

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        $fileSystem = $this->container->get('fileSystem');
        $fileSystem->write('default.txt', 'Hi there');

        $fileSystem = $this->container->get('other');
        $fileSystem->write('other.txt', 'Hi there');
    }
}

Slim

public/index.php, (*19)

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require '../vendor/autoload.php';

// Add Configuration
$config = [
    'settings' => [
        'flysystem' => [
            'adaptors' => [
                // At the bare minimum you must include a default adaptor.
                'default' => [
                    'type' => 'local',
                    'options' => [
                        'root' => '/tmp/slim'
                    ],
                ],

                // Some other Adaptor.  Keys are the names for each adaptor
                'someOtherAdaptor' => [
                    'type' => 'local',
                    'options' => [
                        'root' => '/tmp/slim'
                    ],
                ],
            ],

            'fileSystems' => [
                'other' => [
                    'adaptor' => 'someOtherAdaptor'
                ],
            ],
        ],
    ],
];

$app = new \Slim\App($config);

// Wire up the factory
$container = $app->getContainer();

// FlySystem using the default keys.
$container['fileSystem'] = new \WShafer\PSR11FlySystem\FlySystemFactory();

// FlySystem using a different filesystem configuration
$container['other'] = function ($c) {
    return \WShafer\PSR11FlySystem\FlySystemFactory::other($c);
};


// Example usage
$app->get('/example', function (Request $request, Response $response) {

    /** @var \League\Flysystem\FilesystemInterface $fileSystem */
    $fileSystem = $this->get('fileSystem');
    $fileSystem->put('default.txt', 'Hi there');

    /** @var \League\Flysystem\FilesystemInterface $fileSystem */
    $fileSystem = $this->get('other');
    $fileSystem->put('other.txt', 'Hi there');
});

$app->run();

Configuration

Fly System uses three types of services that will each need to be configured for your application. In addition you will need to create a named service that maps to the \WShafer\PSR11FlySystem\FlySystemFactory based on the container you are using., (*20)

  • Named Services : These are services names wired up to a factory. The configuration will differ based on the type of container / framework in use., (*21)

  • Adaptors : These are the adaptors to to the actual file system. This could be an Azure container, S3, Local, Memory, etc., (*22)

  • Caches : (Optional) Cache layer to optimize performance. While this is optional, this package will use a memory cache by default if none is provide., (*23)

  • File System : This will configure the final FlySystem File System that you will actually use to do the work. This uses the previous two configurations to get you a fully functioning File System to work with. In addition you can also configure a Mount Manager to wire up multiple file systems that need to interact with one another., (*24)

Minimal Configuration

A minimal configuration would consist of at least defining one service and the "default" adaptor., (*25)

Minimal Example (using Zend Expressive for the example)

<?php

return [
    'dependencies' => [
        'factories' => [
            // FlySystem using the default keys.
            'MyServiceName' => \WShafer\PSR11FlySystem\FlySystemFactory::class,
        ],
    ],

    'flysystem' => [
        'adaptors' => [
            // Array Keys are the names used for the adaptor
            'default' => [
                'type' => 'local', # Adaptor name or pre-configured service from the container

                // Adaptor specific options.  See adaptors below
                'options' => [
                    'root' => '/path/to/root', // Path on local filesystem
                ],
            ],
        ],
    ],
];

Using this setup you will be using the "default" file system with the "default" adaptor. In this example we will be using the local file adaptor as the default., (*26)

Full Configuration

Note: An "default" adaptor is required., (*27)

Full Example

<?php

return [
    'flysystem' => [
        'adaptors' => [
            // Array Keys are the names used for the adaptor.  Default entry required for adaptors
            'default' => [
                'type' => 'local', // Adaptor name or pre-configured service from the container

                // Adaptor specific options.  See adaptors below
                'options' => [
                    'root' => '/path/to/root', // Path on local filesystem
                ],
            ],

            'adaptorTwo' => [
                'type' => 'null', // Adaptor name or pre-configured service from the container
                'options' => [],  // Adaptor specific options.  See adaptors below
            ],
        ],

        'caches' => [
            // Array Keys are the names used for the cache
            //
            // Note: You can specify "default" here to overwrite the default settings for the
            // default cache.  Memory is used if not specified
            'default' => [
                'type' => 'psr6',
                // Cache specific options.  See caches below
                'options' => [
                    'service' => 'my_psr6_service_from_container',
                    'key' => 'my_key_',
                    'ttl' => 3000
                ], 
            ],

            'cacheTwo' => [
                'type' => 'psr6',
                // Cache specific options.  See caches below
                'options' => [
                    'service' => 'my_psr6_service_from_container',
                    'key' => 'my_key_',
                    'ttl' => 3000
                ], 
            ],

        ],

        'fileSystems' => [
            // Array Keys are the file systems identifiers.
            //
            // Note: You can specify "default" here to overwrite the default settings for the
            // default file system
            'default' => [
                'adaptor' => 'default', // Adaptor name from adaptor configuration
                'cache' => 'default',   // Cache name from adaptor configuration
                'plugins' => []         // User defined plugins to be injected into the file system
            ],

            // Mount Manager Config
            'manager' => [
                'adaptor' => 'manager',
                'fileSystems' => [
                    'local' => [
                        'adaptor' => 'default', // Adaptor name from adaptor configuration
                        'cache' => 'default',   // PSR-6 pre-configured service
                        'plugins' => []         // User defined plugins to be injected into the file system
                    ],

                    'anotherFileSystem' => [
                        'adaptor' => 'adaptorTwo', // Adaptor name from adaptor configuration
                        'cache' => 'cacheTwo',     // PSR-6 pre-configured service
                        'plugins' => []            // User defined plugins to be injected into the file system
                    ],
                ],
            ],
        ],
    ],
];

File System

<?php

return [
    'flysystem' => [
        'fileSystems' => [
            // Array Keys are the file systems identifiers
            'myFileSystemName' => [
                'adaptor' => 'default', // Required : Adaptor name from adaptor configuration
                'cache' => 'default',   // Optional : Cache name from adaptor configuration
                'plugins' => []         // Optional : User defined plugins to be injected into the file system
            ],
        ],
    ],
];

Adaptors

Example configs for supported adaptors, (*28)

Null/Test

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'myAdaptorName' => [
                'type' => 'null',
                'options' => [], #No options available
            ],
        ],
    ],
];

FlySystem Docs: Null Adaptor, (*29)

Local

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'local',
                'options' => [
                    'root' => '/path/to/root', // Required : Path on local filesystem
                    'writeFlags' => LOCK_EX,   // Optional : PHP flags.  See: file_get_contents for more info
                    'linkBehavior' => League\Flysystem\Adapter\Local::DISALLOW_LINKS, // Optional : Link behavior

                    // Optional:  Optional set of permissions to set for files
                    'permissions' => [
                        'file' => [
                            'public' => 0644,
                            'private' => 0600,
                        ],
                        'dir' => [
                            'public' => 0755,
                            'private' => 0700,
                        ]    
                    ]
                ],
            ],
        ],
    ],
];

FlySystem Docs: Local Adaptor, (*30)

FTP

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'ftp',
                'options' => [
                    'host' => 'ftp.example.com', // Required : Host
                    'username' => 'username',    // Required : Username
                    'password' => 'password',    // Required : Password

                    // optional config settings
                    'port' => 21,
                    'root' => '/path/to/root',
                    'passive' => true,
                    'ssl' => true,
                    'timeout' => 30,
                ],
            ],
        ],
    ],
];

FlySystem Docs: FTP, (*31)

SFTP

Install, (*32)

composer require league/flysystem-sftp

Config, (*33)

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'sftp',
                'options' => [
                    'host' => 'example.com',                              // Required : Host
                    'port' => 21,                                         // Optional : Port
                    'username' => 'username',                             // Optional : Username
                    'password' => 'password',                             // Optional : Password
                    'privateKey' => 'path/to/or/contents/of/privatekey',  // Optional : Host
                    'root' => '/path/to/root',                            // Required : Root Path
                    'timeout' => 10,                                      // Optional : Timeout
                ],
            ],
        ],
    ],
];

FlySystem Docs: SFTP, (*34)

Memory

Install, (*35)

composer require league/flysystem-memory

Config, (*36)

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'memory',
                'options' => [],  // No options available
            ],
        ],
    ],
];

FlySystem Docs: Memory, (*37)

Zip Archive

Install, (*38)

composer require league/flysystem-ziparchive

Config, (*39)

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'zip',
                'options' => [
                    'path' => '/some/path/to/file.zip' // Required : File name and path to use for zip file
                ],
            ],
        ],
    ],
];

FlySystem Docs: Zip Archive, (*40)

Azure

Install, (*41)

composer require league/flysystem-azure

Config, (*42)

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'azure',
                'options' => [
                    'accountName' => 'account-name',  // Required : Account Name
                    'apiKey' => 'api-key',            // Required : API Key
                    'container' => 'container-name',  // Required : Container name
                    'prefix' => 'prefix_',            // Optional
                ],
            ],
        ],
    ],
];

FlySystem Docs: Azure Adaptor, (*43)

AWS S3

Note: AWS V2 is not supported in this package, (*44)

Install, (*45)

composer require league/flysystem-aws-s3-v3

Config, (*46)

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 's3',
                'options' => [
                    'key' => 'aws-key',         // Required : Key
                    'secret'  => 'aws-secret',  // Required : Secret
                    'region'  => 'us-east-1',   // Required : Region
                    'bucket'  => 'bucket-name', // Required : Bucket Name
                    'prefix'  => 'some/prefix', // Optional : Prefix
                    'version' => 'latest'       // Optional : Api Version.  Default: 'latest'
                ],
            ],
        ],
    ],
];

FlySystem Docs: Aws S3 Adapter - SDK V3, (*47)

DropBox

Install, (*48)

composer require spatie/flysystem-dropbox

Config, (*49)

<?php

return [
    'flysystem' => [
        'adaptors' => [
            'default' => [
                'type' => 'dropbox',
                'options' => [
                    'token'   => 'my-token', // Required : API Token
                    'prefix'  => 'prefix',   // Optional : Prefix
                ],
            ],
        ],
    ],
];

FlySystem Docs: DropBox, (*50)

Caches

Example configs for supported caches, (*51)

Memory/Test

<?php

return [
    'flysystem' => [
        'caches' => [
            'default' => [
                'type' => 'memory',
                'options' => [], // No options available
            ],
        ],
    ],
];

FlySystem Docs: Caching, (*52)

Adaptor

This cache adaptor will use another adaptor to store the cache to file to. It will pull this file system from the existing manager., (*53)

<?php

return [
    'flysystem' => [
        'caches' => [
            'default' => [
                'type' => 'adaptor',
                'options' => [
                    'adaptor' => 'MyAdaptorName',  // Required : Adaptor name found in the adaptor config
                    'fileName' => 'my_cache_file', // Required : File name for cache file
                    'ttl' => 300                   // Optional : Time to live
                ], 
            ],
        ],
    ],
];

FlySystem Docs: Caching, (*54)

PSR-6

<?php

return [
    'flysystem' => [
        'caches' => [
            'default' => [
                'type' => 'psr6',
                'options' => [
                    'service' => 'my_psr6_service_from_container', // Required : Service to be used from the container
                    'key' => 'my_key_',                            // Required : Cache Key
                    'ttl' => 3000                                  // Optional : Time to live
                ],
            ],
        ],
    ],
];

FlySystem Docs: Unknown, (*55)

Predis

<?php

return [
    'flysystem' => [
        'caches' => [
            'default' => [
                'type' => 'predis',
                'options' => [
                    'service' => 'my_predis_client_from_container', // Required : Configured Predis Client Service to pull from container
                    'key' => 'my_key_',                             // Required : Cache Key
                    'ttl' => 3000                                   // Optional : Time to live
                ],
            ],
        ],
    ],
];

FlySystem Docs: Caching, (*56)

Memcached

<?php

return [
    'flysystem' => [
        'caches' => [
            'default' => [
                'type' => 'memcached',
                'options' => [
                    'service' => 'my_memcached_client_from_container', // Required : Configured Memcached Client Service to pull from container
                    'key' => 'my_key_',                                // Required : Cache Key
                    'ttl' => 3000                                      // Optional : Time to live
                ],
            ],
        ],
    ],
];

FlySystem Docs: Caching, (*57)

Stash

See: PSR6, (*58)

Note: While "The League" provides a native cache client, Stash itself already implements a PSR 6 interface. It is recommended to use that instead., (*59)

Upgrades

Version 1 to Version 2

When upgrading from version 1 to version 2, there shouldn't be any changes needed. Please note that using the FlySystemManager directly is no longer recommended. Named services should be used instead. See above for more info., (*60)

Changes
  • A "default" filesystem entry is added automatically to the config. This default file system requires you to either specify a configured adaptor for the filesystem OR there must be a default adaptor configured in order to use it. Most Version 1 users should not have an issue with this change and the factories should still function normally., (*61)

  • The default cache can now be overwritten and reconfigured. Previously a "memory" cache was always used when the file system didn't state the cache to use., (*62)

The Versions