Storage (framework-storage)
Dieses Paket regelt den Zugriff auf Dateien. Die Dateien können dabei auf verschiedene Arten gespeichert werden (lokal, S3-Speicher, SFTP). Dieses Paket arbeitet eng mit dem Paket League\Flysystem zusammen.
Einrichtung
Das Paket verfügt über zwei Tabellen, welche die Speichertypen der verschiedenen Verzeichnisse definieren. Dabei werden von brandbox vordefinierte Volumen an Adapter verknüpft. Ein Adapter gibt vor, welches Unterverzeichnis welchem Speichertyp zugewiesen ist. Diese Verknüpfung von Volumen und Adaptern kann von der Volumenkonfiguration übersteuert werden. In manchen Fällen (bspw. Temporärverzeichnissen) ist es nicht sinnvoll sie anders als lokal zu speichern. Standardmäßig stehen zwei Speichertypen zur Verfügung: lokal und S3.
So kann bspw. für das Volumen share ein Adapter für das Verzeichnis public erstellt werden, welcher den Speichertyp S3 definiert.
S3
Um einen S3-Speicher nutzen zu können, müssen diverse Informationen bereitgestellt werden. Diese Informationen werden nicht in der Datenbank abgelegt oder über die UI konfiguriert. Sie müssen wie folgt in der config.php definiert werden.
S3 Konfiguration
's3' => [
'is_active' => true,
'use_path_style_endpoint' => true,
'endpoint' => 'endpointWithProtocol',
'region' => 'us-east-1',
'bucket' => 'brandbox-test',
'credentials' => [
'key' => 'EXAMPLEKEY',
'secret' => 'EXAMPLESECRET'
],
'http' => [
'verify' => false,
'timeout' => 60
]
]
Struktur und Funktionsweise
Wie beschrieben arbeitet das Paket mit League\Flysystem zusammen und abstrahiert den Funktionsumfang davon.
Öffentlicher Zugriff
Neben einer regulären Manager-Klasse bietet das Paket zwei weitere Manager an, die den Umfang mit Dateien (\Brandbox\FrameworkStorage\Framework\Storage\FileManager) und Ordnern (\Brandbox\FrameworkStorage\Framework\Storage\DirectoryManager) vereinfachen sollen. Es wird empfohlen möglichst mit diesen zwei Manager-Klassen zu arbeiten. Die veralteten Funktionen von Brandbox/Filesystem sollten durch die neuen Funktionen der Directory- und FileManager ersetzt werden. Die Methoden der Manager können sowohl mit relativen, als auch mit absoluten Pfaden umgehen.
Die Setup-Klasse
Eine zentrale Klasse von Framework\Storage ist die Setup-Klasse (\Brandbox\FrameworkStorage\Framework\Storage\Lib\Execute\Setup). Diese Klasse ist ein Singleton und sollte über die get-Methode instanziiert werden. Über den Konstruktor wird der MountManager erstellt, welcher über Events erweitert werden kann. Diese Klasse bietet außerdem eine Methode an, welches einen Pfad so Präfixt, dass dieser Pfad einer Operator-Instanz von Flysystem übergeben werden kann.
Die von framework-storage bereitgestellten Methoden zur Interaktion mit Dateien und Ordnern folgen alle einem ähnlichen Schema. Die Setup-Klasse wird instanziiert, dem Pfad wird ein Präfix verliehen, die Operator-Instanz wird aus der Setup-Klasse bezogen und letztlich wird die konkrete Methode im Operator angesprochen. Hier beispielhaft die Kopier-Methode für Dateien.
Framework\Storage - CopyFile
public function execute(string $source, string $destination, array $config = []): void
{
$setup = Storage\Lib\Execute\Setup::get();
$operatorWrapper = $setup->getWrapper();
$source = $setup->prefixPath($source);
$destination = $setup->prefixPath($destination);
$operatorWrapper->copy($source, $destination, $config);
}
Events
Um in das Vorgehen von framework-storage einzugreifen, stehen folgende Events zur Verfügung.
Event | Beschreibung |
---|---|
\Brandbox\FrameworkStorage\Framework\Storage\Lib\Event\OnPrefixPath | Dieses Event bietet die Möglichkeit einem Pfad ein Präfix zu verabreichen. Neben dem Pfad wird der ermittelte Speichertyp bereitgestellt. |
\Brandbox\FrameworkStorage\Framework\Storage\Lib\Event\OnPopulateMounts | Dieses Event ermöglicht es weitere Mounts hinzuzufügen. Das dafür vorgesehene Array ist assoziativ. Jeder neue Eintrag muss den Speichertyp als key erhalten. Der value entspricht der bereitzustellenden \League\Flysystem\FilesystemOperator -Instanz. Das Array wird im Anschluss dem MountManager von Flysystem übergeben. |