PHPackages                             sohophp/sofinder-s3 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [File &amp; Storage](/categories/file-storage)
4. /
5. sohophp/sofinder-s3

ActiveSymfony-bundle[File &amp; Storage](/categories/file-storage)

sohophp/sofinder-s3
===================

S3-compatible object storage adapter for SoFinder

v0.1.0-beta.2(today)00MITPHPPHP ^8.2CI passing

Since Aug 24Pushed todayCompare

[ Source](https://github.com/sohophp/sofinder-s3)[ Packagist](https://packagist.org/packages/sohophp/sofinder-s3)[ Docs](https://github.com/sohophp/sofinder-s3)[ RSS](/packages/sohophp-sofinder-s3/feed)WikiDiscussions main Synced today

READMEChangelog (2)Dependencies (4)Versions (3)Used By (0)

SoFinder S3 adapter
===================

[](#sofinder-s3-adapter)

This optional bundle adds an `s3` storage adapter to SoFinder through AWS SDK for PHP v3.

```
composer require sohophp/sofinder-s3:^0.1@beta
```

Register `SoFinderS3Bundle` after `SoFinderBundle` in `config/bundles.php`:

```
return [
    SohoPHP\SoFinder\SoFinderBundle::class => ['all' => true],
    SohoPHP\SoFinderS3\SoFinderS3Bundle::class => ['all' => true],
];
```

Then configure a resource:

```
so_finder:
  resources:
    RemoteAssets:
      adapter: s3
      root: media
      delivery_mode: proxy
      public_url: ''
      options:
        bucket: '%env(SOFINDER_S3_BUCKET)%'
        region: '%env(SOFINDER_S3_REGION)%'
        endpoint: '%env(SOFINDER_S3_ENDPOINT)%'
        use_path_style_endpoint: false
```

Omit `endpoint` for AWS S3. Use `region: auto` plus the account endpoint for Cloudflare R2. MinIO normally requires `use_path_style_endpoint: true`; HTTP is rejected unless `allow_insecure_endpoint: true` is explicitly set for a trusted development network. Set `root: /` to expose the bucket root.

The AWS default credential provider chain is used unless `access_key_id` and `secret_access_key` are both supplied through environment-backed configuration. Never commit credentials. Private resources should use proxy delivery. A public resource may configure `public_url` as the CDN or bucket URL corresponding to the configured root. Set `delivery_mode: public` to expose that URL in browser entries, copied links and editor selections. The adapter appends the logical object path, so a resource rooted at `component-images` should use a base such as `https://cdn.example.com/component-images`. Keep `delivery_mode: proxy` and `public_url: ''` for private objects that must remain behind SoFinder's authenticated content endpoint.

S3 deletion is permanent from SoFinder's perspective. Enable bucket versioning or provider lifecycle protection when recovery is required.

Provider status
---------------

[](#provider-status)

ProviderStatusNotesAWS S3SupportedOmit the custom endpoint.Cloudflare R2SupportedUse the account endpoint and `region: auto`.MinIOCI verifiedUse path-style URLs; allow HTTP only on a trusted development network.Backblaze B2Contract verifiedUse its regional HTTPS endpoint; conditional Put Object is disabled automatically.DigitalOcean Spaces, WasabiCompatible candidatesUse their S3 endpoint; treat as unverified until the contract suite passes in your environment.Backblaze B2 smoke test
-----------------------

[](#backblaze-b2-smoke-test)

Backblaze B2 can be tested directly from this repository; Winstar is not required. Use an existing non-production bucket and a manually created B2 application key. The key ID is the access key ID, and the application key is the secret access key. Do not use the master application key or commit values to this repository.

Copy the safe template once, fill `.env.local`, then run the single external test. Symfony Dotenv loads this file automatically for the test process; `.env.local` is ignored by Git and must never be committed:

```
cd packages/sofinder-s3
cp .env.example .env.local
# Edit .env.local with the B2 endpoint, region, test bucket and application key.
vendor/bin/phpunit --filter S3ProviderSmokeTest
```

The test does not create a bucket. It writes only beneath a random `/provider-smoke/` prefix, checks Unicode stream CRUD, listing, copy, move, usage, permanent deletion and adapter audit, then performs best-effort cleanup. Set `SOFINDER_PROVIDER_PREFIX` to the same prefix allowed by a prefix-restricted application key; leave it empty only for a bucket-wide key. Keep `SOFINDER_PROVIDER_USE_PATH_STYLE_ENDPOINT` unset for B2. If the application key is restricted to one bucket, enable B2's list-all-bucket-names permission for SDK compatibility. B2 buckets are always versioned, so final cleanup lists versions only inside the random prefix and deletes them by version ID. The application key therefore needs list/read/write/delete access; configure an appropriate lifecycle rule as a fallback for retained versions.

Backblaze B2 does not implement `If-None-Match` for Put Object. The adapter recognizes `*.backblazeb2.com` endpoints and omits that conditional header after performing its normal existence check. AWS S3 and MinIO retain atomic conditional creation. Other compatible providers can set `options.conditional_writes: false` explicitly when they have the same API limitation; disabling it introduces a small concurrent-create race window.

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

0d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/0066452c6da8ec15a53c67d4e3594c3d5af27f675357decf05a486ad7cee61d7?d=identicon)[sohophp](/maintainers/sohophp)

---

Top Contributors

[![sohophp](https://avatars.githubusercontent.com/u/18595011?v=4)](https://github.com/sohophp "sohophp (2 commits)")

---

Tags

s3minioobject-storagecloudflare-r2sofinder

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/sohophp-sofinder-s3/health.svg)

```
[![Health](https://phpackages.com/badges/sohophp-sofinder-s3/health.svg)](https://phpackages.com/packages/sohophp-sofinder-s3)
```

###  Alternatives

[league/flysystem-aws-s3-v3

AWS S3 filesystem adapter for Flysystem.

1.7k293.8M1.2k](/packages/league-flysystem-aws-s3-v3)[aws/aws-sdk-php-laravel

A simple Laravel 9/10/11/12/13 service provider for including the AWS SDK for PHP.

1.7k39.1M90](/packages/aws-aws-sdk-php-laravel)[kolay/xlsx-stream

Streaming XLSX reader and writer for PHP and Laravel. Constant memory regardless of file size, direct S3 multipart streaming, optional born-indexed random access.

4512.6k](/packages/kolay-xlsx-stream)[mwguerra/filemanager

A full-featured file manager package for Laravel and Filament v5 with dual operating modes, drag-and-drop uploads, S3/MinIO support, and comprehensive security features.

8027.8k4](/packages/mwguerra-filemanager)[klinson/aws-s3-minio

Flexible and feature-complete minio client for PHP, depend on aws/aws-sdk-php

1320.4k](/packages/klinson-aws-s3-minio)[maxserv/fal_s3

Connect FAL/TYPO3 to any of the configured S3 buckets with a few clicks. File based configuration allows specific buckets depending on the context of your application.

1688.9k](/packages/maxserv-fal-s3)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
