Storage driver addon for trail
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-18 16:31:10 -06:00
src bunny cdn purging 2026-10-18 16:31:10 -06:00
.editorconfig port from apricot 2026-10-18 01:18:49 -06:00
.gitignore port from apricot 2026-10-18 01:18:49 -06:00
composer.json bump requirements 2026-10-18 01:48:31 -06:00
LICENSE port from apricot 2026-10-18 01:18:49 -06:00
README.md bunny cdn purging 2026-10-18 16:31:10 -06:00

trail-storage

Storage driver addon for trail. Supports local storage, bunny storage, and s3-compatible platforms

install

composer require trail/storage

config

// trail/config/storage.php
return [
    '*' => [
        'default' => 'images',
        'disks' => [
            'images' => [
                'driver' => 's3',
                'bucket' => Env::get('S3_BUCKET'),
                'accessKey' => Env::get('S3_ACCESS_KEY'),
                'secretKey' => Env::get('S3_SECRET_KEY'),
                'endpoint' => Env::get('S3_ENDPOINT'),
                'region' => Env::get('S3_REGION'),
                'url' => Env::get('S3_PUBLIC_URL'),
                'acl' => 'public-read',
            ],
            'cdn' => [
                'driver' => 'bunny',
                'zone' => Env::get('BUNNY_STORAGE_NAME'),
                'accessKey' => Env::get('BUNNY_ACCESS_KEY'),
                'region' => Env::get('BUNNY_REGION'),
                'url' => Env::get('BUNNY_CDN_URL'),

                // account api key [cdn purges]
                'apiKey' => Env::get('BUNNY_API_KEY'),
            ],
            'uploads' => [
                'driver' => 'local',
                'root' => 'web/uploads',
                'url' => '/uploads',
            ],
        ],
    ],
];

use

use Trail\Storage\Storage;

$disk = Storage::disk('images');
$disk->write('2026/cat.jpg', $upload->stream());
$disk->read('2026/cat.jpg');
$disk->stream('2026/cat.jpg');
$disk->has('2026/cat.jpg');
$disk->size('2026/cat.jpg');
$disk->files('2026');
$disk->folders('2026');
$disk->copy('2026/cat.jpg', 'backup/cat.jpg');
$disk->move('2026/cat.jpg', '2027/cat.jpg');
$disk->delete('2027/cat.jpg');
$disk->url('2026/cat.jpg');

purge

Bunny disks with an apiKey set will autoclear cdn cache

if ($disk instanceof Cdn && $disk->canPurge()) {
    $disk->purge('2026/cat.jpg');
}

custom driver

// in addon's register()
Storage::driver('ftp', static fn (array $options): Disk => new FtpDisk($options));