Skip to content

Storage interface

composer require quillstack/storage-interface

Common interface for Storage classes.

Six methods, so that something writing files does not have to know which files. A package depending on this one works the same against the disk, against a bucket, or against something held in memory for a test.

Why this exists

Three packages in this framework read and write files — the cache, the logger and dotenv — and none of them should call file_put_contents itself, because then none of them can be tested without a disk.

So they take this interface, and a test hands them something that keeps files in an array. It is one interface with four methods, in its own package, so that depending on it does not mean depending on an implementation.

Requirements

  • PHP 8.1 or newer

Installation

shell
composer require quillstack/storage-interface

Usage

Ask for the interface, not for an implementation:

php
use Quillstack\StorageInterface\StorageInterface;

final class Invoices
{
    public function __construct(private readonly StorageInterface $storage)
    {
    }

    public function keep(string $number, string $pdf): void
    {
        $this->storage->save("/invoices/{$number}.pdf", $pdf);
    }
}

Point it at whichever storage the application uses:

php
$app = new App(__DIR__ . '/../.env', [
    StorageInterface::class => LocalStorage::class,
]);

Technical documentation

MethodDoes
get(string $path): mixedreads what is there
exists(string $path): boolwhether there is anything at that path
missing(string $path): boolthe other way round, because !exists() reads worse
save(string $path, mixed $contents): boolwrites, replacing whatever was there
add(string $path, mixed $contents): boolwrites on the end of what is there
delete(string $path, string ...$more): boolremoves one or several

What implements it

quillstack/queue writes messages through it, which is why a queue can be pointed somewhere other than the local disk without knowing it has been.

There is nothing to run here: a package which only names things has no behaviour to test.

Benchmark

There is nothing here to measure.

This package contains one interface and no code that runs. What it costs is an autoload of a few hundred bytes; what it does is entirely done by whatever implements it — which for a local disk is quillstack/local-storage, and that one is measured against league/flysystem in its own README.

A benchmark section that invented a number for an interface would be worse than one that says this.

Tests

shell
composer test
composer stan

The rest of Quillstack

This is one component of Quillstack, a PHP framework which is as simple to use as it is strict about what it does.

License

MIT. See LICENSE.

Released under the MIT License.