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 описаны в документации.
Комментарии: