thib92 / flysystem-public-url-plugin

Flysystem plugin to get the public URL of a file
3 stars 0 forks source link
flysystem flysystem-plugin php symfony

Flysystem Public URL Plugin

This repo is a plugin for the Flysystem PHP library.

It allows you to get a public URL to access a file.

Getting started

Start by adding this plugin to your dependencies using Compose:

composer require thib92/flysystem-public-url-plugin

Then, add the plugin to your Flysystem filesystem:

<?php
$adapter = new \League\Flysystem\Adapter\Local(__DIR__.'/path/to/root/');
$filesystem = new \League\Flysystem\Filesystem($adapter);
$filesystem->addPlugin(new \Thib\FlysystemPublicUrlPlugin\PublicUrlPlugin);

Finally, use it as a regular Flysystem plugin:

<?php
$filesystem->getPublicUrl("/path/to/my/file");

Supported adapters

The supported Flysystem adapters are:

Adapters options

Some adapters need options. For example, the Local Flysystem does not know if the upload directory is served by a webserver.

In order to set settings, you can use the setParam method of the PublicUrlPlugin. For example:

<?php
$plugin = new \Thib\FlysystemPublicUrlPlugin\PublicUrlPlugin();
$plugin->setParam(\Thib\FlysystemPublicUrlPlugin\Adapter\LocalUrlAdapter::class, [
    "/path/to/webserver/root"
]);

The first argument of setParam is the class of the PublicUrlAdapter you use.
The second one is a sequential array of constructor arguments for this adapter. Refer to the individual adapter documentations below to know what to set

Adapters reference

Flysystem Adapter Public URL Adapter Constructor arguments
Local LocalUrlAdapter * Public webserver root path
AWS S3 v3 AwsS3UrlAdapter None

Adding your own adapter

If you need an adapter for another Flysystem adapter, two steps are required:

1. Create your Adapter class

Your Adapter class will need to extend the AbstractPublicUrlAdapter. You will directly get a reference to the filesystem instance with $this->filesystem. You will need to implement the getPublicUrl(string $path): string method.

2. Register it in the plugin

Then you need to use the PublicUrlPlugin::addAdapter method to register your adapter. This method takes 3 arguments:

Contributing

I only created this plugin for the needs of a project I had. I only used the AWS S3 and the Local adapters. Therefore, if you create an adapter, feel free to create a PR on this repo with your code. Don't forget to add tests: