Create custom plugins for Flysystem

Code
<?php

use League\Flysystem\Filesystem;
use 
League\Flysystem\Adapter\Local;
use 
League\Flysystem\Plugin\AbstractPlugin;

// Create your custom Flysystem plugin
class BackupPlugin extends AbstractPlugin
{
    public function 
getMethod()
    {
        return 
'backupFiles';
    }
    
    public function 
handle($dir)
    {
        
$fs $this->filesystem;
        
$backupPath $dir '/backup';
        
        
$fs->assertPresent($dir);
        
        if (!
$fs->has($backupPath)) {
            
$fs->createDir($backupPath);
        }
        
        foreach (
$fs->listContents($dir) as $file) {
            if (
'file' === $file['type']) {
                
// do some safer backup than this in your code!
                
$backupFile $backupPath '/' $file['basename'];
                if (
$fs->has($backupFile)) {
                    
$fs->delete($backupFile);
                }
                
$fs->copy($file['path'], $backupFile);
            }
        }
    }
}

// Create Flysystem filesystem object
$dir __DIR__;
$adapter = new Local($dir);

$fs = new Filesystem($adapter);

echo 
'<b>All files in "files" directory</b>' PHP_EOL;
foreach (
$fs->listContents('files') as $file) {
    echo 
$file['path'] . PHP_EOL;
}

// Add and use custom BackupPlugin
$fs->addPlugin(new BackupPlugin());
$fs->backupFiles('files');

$fs->assertPresent('files/backup');

echo 
'<b>All files in new "files/backup" directory</b>' PHP_EOL;
foreach (
$fs->listContents('files/backup') as $file) {
    echo 
$file['path'] . PHP_EOL;
}
Result
All files in "files" directory
files/file1.txt
files/file2.txt
files/file3.txt
All files in new "files/backup" directory
files/backup/file1.txt
files/backup/file2.txt
files/backup/file3.txt
Used Versions
PHP 8.2, Laminas MVC 3.2, Symfony 5.2, Laravel 8.28, PHPUnit 9.5, Doctrine ORM 2.8