Every two weeks I send out a newsletter containing lots of interesting stuff for the modern PHP developer. You can expect quick tips, links to interesting tutorials, opinions and packages. Want to learn the cool stuff? Then sign up now!

Dropbox will turn off v1 of their API soon. It’s time to update your PHP application.

Last year on 28th of June Dropbox deprecated v1 of their API. On the same date this year they will turn off all v1 endpoints. If you’re using using Flysystem, Laravel or the official PHP SDK to work with Dropbox, it’s the time to update.

Last week my company released a Dropbox API client and a Flysystem Dropbox adapter that both use v2 of the dropbox API. In this blogpost I’d like to explain how to install and use these packages.

Updating Flysytem adapters

Flysystem is an awesome package created by Frank de Jonge that abstracts filesystems. It provides a common API for all kinds of filesystems. So you can use the same API to work with S3, Dropbox, Sftp servers and whatnot. Until recently Flysystem suggested to use their home cooked Dropbox adapter. That driver only supports v1 of the Dropbox API. Therefore will stop working after 28th of June of this year. If your project uses that adapter you can very easily swap it with our new Dropbox adapter.

This is how you newed up the old adapter:

use League\Flysystem\Dropbox\DropboxAdapter;
use League\Flysystem\Filesystem;
use Dropbox\Client;

$client = new Client($accessToken, $appSecret);
$adapter = new DropboxAdapter($client);

$filesystem = new Filesystem($adapter);

This is how you should new up the new adapter (after having run composer require spatie/flysystem-dropbox.

use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client;
use Spatie\FlysystemDropbox\DropboxAdapter;

$client = new Client($authorizationToken);

$adapter = new DropboxAdapter($client);

$filesystem = new Filesystem($adapter);

Notice that instead of an accessToken and an appSecret you now need a authorizationToken. Luckily Dropbox has made this very easy. You can just generate a token in the App Console for any Dropbox API app. You’ll find more info at the Dropbox Developer Blog.

Updating Laravel applications

Laravel comes with filesystem abstraction out of the box. Under the hood it’s powered by Flysystem. So if you’re currently using a Dropbox disk in Laravel you also have a bit of work to upgrade. In order to make use of Dropbox disk you had to create a service provider not unlike this one (example taken from the old Laravel docs):

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Dropbox\Client as DropboxClient;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Dropbox\DropboxAdapter;

class DropboxServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Storage::extend('dropbox', function ($app, $config) {
            $client = new DropboxClient(
                $config['accessToken'], $config['clientIdentifier']
            );

            return new Filesystem(new DropboxAdapter($client));
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

To upgrade simply pull in our Dropbox adapter by running composer require spatie/flysystem-dropbox. Next you must update your service provider.

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Illuminate\Support\ServiceProvider;
use Spatie\FlysystemDropbox\DropboxAdapter;

class DropboxServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Storage::extend('dropbox', function ($app, $config) {
            $client = new DropboxClient(
                $config['authorizationToken']
            );

            return new Filesystem(new DropboxAdapter($client));
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Like mentioned above you can generate authorization token on the App Console at Dropbox.

And with your Laravel application makes use of Dropbox API v2.

Updating other applications

If your application uses the old Dropbox PHP SDK you’ll be sad to learn that there currently are no plans to release and official PHP SDK for v2.

But you have a few options to upgrade. You could opt to use our dropbox-api package. It currently only support the methods needed by our Flysystem dropbox adapter, but we’re open for PRs that add more methods to the package.

Alternativly you could use the Dropbox package by Kunal Varma or the Dropbox SDK made by Alorel, but both don’t have stable releases just yet.

In closing

If you’re using Dropbox in your application be sure to verify that you’re using v2 of the API. Still on v1? Then be sure to upgrade before 28th of July to avoid tears or worse. Our Flysystem adapter and API package can help out.

These packages are not the first ones my company has released. Be sure to check out this pile of packages we’ve previously released.

Freek Van der Herten is a partner and developer at Spatie, an Antwerp based company that specializes in creating web apps with Laravel. After hours he writes about modern PHP and Laravel on this blog. When not coding he’s probably rehearsing with his kraut rock band.
  • Miguel Piedrafita

    Is the Laravel built-in filesystem safe?

    • Laravel doesn’t come with Dropbox integration out of the box. Read the “Updating Laravel applications” from the post above to learn more.

  • thanks just upgraded took only minutes!