File System

Компонент для работы с файловыми хранилищами на основе Flysystem.
Он позволяет работать как с локальной файловой системой, так и с удаленными хранилищами  используя единый интерфейс. Например с Amazon AWS S3, Azure Blob Storage, Yandex Objet Storage, BunnyCdn, Google Cloud Storage, WebDav, FTP, SFTP и др.

Класс для работы с локальной файловой системой входит в состав Cotonti Lib и не требует доплнительной установки других библиотек. Его интерфейс совместим с \League\Flysystem\FilesystemOperator и они взаимозаменяемы.

Для подключения другой (удаленной) файловой системы нужно установить Flysystem и нужный адаптер.

Для этого в composer.json нужно добавить строки:

"league/flysystem": "^3.0",
"league/flysystem-aws-s3-v3": "^3.0"

В этом примере мы добавили адаптер для файловых хранилищ, поддерживающий AWS S3.

И выполнить в командной строке:

composer update

Composer для Windows имеет баг который может в файле lib/composer/autoload_static.php сделать что то такое:

public static $fallbackDirsPsr4 = array (
  0 => 'C:\\OpenServerData\\domains\\my-site.loc\\public_html\\lib',
);

Надо вернуть как было:

public static $fallbackDirsPsr4 = array (
  0 => DIR . '/../..' . '/lib',
);

Теперь адатер файловой системы готов к использованию в коде Ваших расширений.

 

Для создания экземпляра можно воспользоваться инструкцией к соотвествующему адаптеру или воспользоваться "фабрикой" из Cotonti Lib.
Использование фабрики является предпочтительным при создании расширений т.к. позволяет конфигурировать подключения к файловым системам и использовать нужные в зависимости от конфигурации.

 

Конфигурирование файловых систем.

 

В файл datas/config.php нужно добавить элемент такого вида:

$cfg['filesystem'] = [
	
    // Подключение к Yandex Object Storage
    'Yandex.Cloud' => [
        'adapter' => '\League\Flysystem\AwsS3V3\AwsS3V3Adapter',
        'config' => [
            //'version' => 'latest', // Optional
            'endpoint' => 'https://storage.yandexcloud.net',
            'region' => 'ru-central1',
            'bucket' => 'my-bucket-name',
            'accessKey' => 'MyAccessKey',
            'secretKey' => 'MySecretKey',

            // install: composer require league/flysystem-path-prefixing:^3.3 to use prefix
            //'pathPrefix' => 'a/path/prefix',
        ],
    ],
	
    // Подключение к другому серверу по FTP
    'FTP' => [
        'adapter' => '\League\Flysystem\Ftp\FtpAdapter',
        'config' => [
            'client' => [
                'host' => 'my-pretty-host.tld',
                'root' => '/var/www/files/storage/here',
                'username' => 'server-user',
                'password' => 'someThingReallySecret',
            ],

            // install: composer require league/flysystem-path-prefixing:^3.3 to use prefix
            //'pathPrefix' => 'a/path/prefix',
        ],
    ],
	
    // Подключение к BunnyCDN
    'BunnyCDN' => [
        'adapter' => '\PlatformCommunity\Flysystem\BunnyCDN\BunnyCDNAdapter',
        'config' => [
            'storageZoneName' => 'test-files',
            'apiKey' => 'my-api-key',
            'pullZoneUrl' => 'https://test-files.b-cdn.net',
            //'region' => 'de', // optional

            // install composer require league/flysystem-path-prefixing:^3.3 to use prefix
            //'pathPrefix' => 'a/path/prefix',
        ],
    ],
];	

В этом примере мы сконфигурировали подключение к Yandex Object Storage и к удаленному серверу по FTP.

Ключ массива - это название подключения, может быть любым.

'adapter' - имя класса адаптера. Поддерживаются и псевдонимы. Например вместо '\League\Flysystem\AwsS3V3\AwsS3V3Adapter' можно использовать 'Aws' или 'AwsS3'. Фабрика их поймет.

'config' - конфигурация подключения. Т.к. файловые системы имют очень разные API и способы подключения, то для каждого адаптера 'config' свой.
За подробностями можно обратиться к описанию самого адаптера и в код файла фабрики.

Если вы хотите добавить в фабрику подключение адаптера, которого в ней нет или создать подключение с более специфичной конфигурацией, то это можно сделать либо через хук filesystem.getFilesystem либо определив функцию cot_getFilesystem($fileSystemName, $pathPrefix).

 

Пример использования:

use \filesystem\FilesystemFactory;

// Получить экземпляр класса файловой системы по имени подлючения из конфига выше
$filesystem = FilesystemFactory::getFilesystem('Yandex.Cloud');

// Запись в файл
$filesystem->write($path, $contents);

 

Методы класса \League\Flysystem\Filesystem описаны в документации.

 
Опубликовано: Alex
Комментарии: (0)
Рейтинги:  
0

Теги:

Нет тегов

Комментарии:


Комментарии отсутствуют

Оставить комментарий:

* Просьба все технические вопросы, которые могут потребовать обсуждения, задавать на форуме.
** все некорректные и рекламные посты будут удаляться, ненормативная лексика и оскорбительные высказывания запрещаются.

* Для редактирования комментария осталось 15 минут