<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>File System</title>
		<link>https://lily-software.com</link>
		<description>Лента комментариев страницы</description>
		<generator>Cotonti</generator>
		<language>ru</language>
		<pubDate>Mon, 06 Apr 2026 23:35:18 +0300</pubDate>

		<item>
			<title>Комментируемая страница</title>
			<description><![CDATA[<p style="text-align:justify;">Компонент для работы с файловыми хранилищами на основе <a href="https://flysystem.thephpleague.com" target="_blank" rel="nofollow noreferrer noopener">Flysystem</a>.<br />
Он позволяет работать как с локальной файловой системой, так и с удаленными хранилищами  используя единый интерфейс. Например с Amazon AWS S3, Azure Blob Storage, Yandex Objet Storage, BunnyCdn, Google Cloud Storage, WebDav, FTP, SFTP и др.</p>

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

<p>Для подключения другой (удаленной) файловой системы нужно установить <a href="https://flysystem.thephpleague.com/docs/" target="_blank" rel="nofollow noreferrer noopener">Flysystem и нужный адаптер</a>.</p>

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

<pre class="brush:plain;">
"league/flysystem": "^3.0",
"league/flysystem-aws-s3-v3": "^3.0"</pre>

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

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

<pre class="brush:bash;">
composer update</pre>

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

<pre class="brush:php;">
public static $fallbackDirsPsr4 = array (
  0 =&gt; 'C:\\OpenServerData\\domains\\my-site.loc\\public_html\\lib',
);
</pre>

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

<pre class="brush:php;">
public static $fallbackDirsPsr4 = array (
  0 =&gt; DIR . '/../..' . '/lib',
);</pre>

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

<p> </p>

<p style="text-align:justify;">Для создания экземпляра можно воспользоваться инструкцией к соотвествующему <a href="https://flysystem.thephpleague.com/docs/" target="_blank" rel="nofollow noreferrer noopener">адаптеру</a> или воспользоваться <strong>"фабрикой"</strong> из <strong>Cotonti Lib</strong>.<br />
Использование фабрики является предпочтительным при создании расширений т.к. позволяет конфигурировать подключения к файловым системам и использовать нужные в зависимости от конфигурации.</p>

<p> </p>

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

<p> </p>

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

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

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

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

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

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

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

<p style="text-align:justify;"><strong>'adapter'</strong> - имя класса адаптера. Поддерживаются и псевдонимы. Например вместо <code>'\League\Flysystem\AwsS3V3\AwsS3V3Adapter'</code> можно использовать <code>'Aws'</code> или <code>'AwsS3'</code>. Фабрика их поймет.</p>

<p><strong>'config'</strong> - конфигурация подключения. Т.к. файловые системы имют очень разные API и способы подключения, то для каждого адаптера 'config' свой.<br />
За подробностями можно обратиться к описанию самого <a href="https://flysystem.thephpleague.com/docs/" target="_blank" rel="nofollow noreferrer noopener">адаптера</a> и в код <a href="https://github.com/Alex300/cotonti-lib/blob/master/lib/filesystem/FilesystemFactory.php" target="_blank" rel="nofollow noreferrer noopener">файла фабрики</a>.</p>

<p style="text-align:justify;">Если вы хотите добавить в фабрику подключение адаптера, которого в ней нет или создать подключение с более специфичной конфигурацией, то это можно сделать либо через хук <code>filesystem.getFilesystem</code> либо определив функцию <code>cot_getFilesystem($fileSystemName, $pathPrefix)</code>.</p>

<p> </p>

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

<pre class="brush:php;">
use \filesystem\FilesystemFactory;

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

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

<p> </p>

<p>Методы класса <code>\League\Flysystem\Filesystem</code> описаны в <a href="https://flysystem.thephpleague.com/docs/usage/filesystem-api/" target="_blank" rel="nofollow noreferrer noopener">документации</a>.</p>
]]></description>
			<pubDate>вт, 24 окт 2023 18:38:00 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/free-scripts/cotonti-lib/file-system]]></link>
		</item>
	</channel>
</rss>