はじめに
Laravelのストレージ操作はFlysystemという抽象ファイルシステムを使用しており、ローカルのファイルシステムやAmazon S3、Rackspaceといったクラウドストレージを操作できるドライバが提供されています。
今回はここにDropboxを操作する設定を加えていきたいと思います。
(Laravel 5.1と5.5で動作することを確認済み)
Dropbox側の操作
アプリの作成開始
App Consoleから、「My Apps」を開き、「Create app」をクリックします。
作成するアプリの設定
必要な情報を入力して、アプリの作成をします。
今回はDropbox上の指定フォルダのみを操作するアプリとして作成してみました。
accessTokenの取得
アプリが作成できたら、設定画面に自動遷移します。
OAuth2の欄内にある「Generate」をクリックして、作成されたaccessTokenをコピーしておいてください。
accessTokenを作成すると、Dropboxの「アプリ」フォルダの下に、対応するフォルダが自動で作成されるようです。
(確認メールやらスマホアプリの通知やらが一斉に飛んできてビクッとしました)
Laravel側の操作
.envファイルに取得したaccessTokenを記述
DROPBOX_ACCESS_TOKEN=hogehoge
php artisan config:clear
を忘れずに。
必要なパッケージの取得
コチラのドキュメントでは、spatie/flysystem-dropbox
を使うような記述になっていますが、どうやらv1のAPIを使用しているようで、現在は使えません。
v2に対応している、コチラを使用します。
$ composer require srmklive/flysystem-dropbox-v2
ServiceProviderを作成
php artisan make:provider DropboxFilesystemServiceProvider
ServiceProviderの中身を実装
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Storage;
use League\Flysystem\Filesystem;
use Srmklive\Dropbox\Client\DropboxClient;
use Srmklive\Dropbox\Adapter\DropboxAdapter;
class DropboxFilesystemServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
Storage::extend('dropbox', function ($app, $config) {
return new Filesystem(new DropboxAdapter(new DropboxClient($config['accessToken'])));
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
Filesystemの設定に追記
'disks' => [
// 以下を追記
'dropbox' => [
'driver' => 'dropbox',
'accessToken' => env('DROPBOX_ACCESS_TOKEN'),
],
],
ServiceProviderを登録
'providers' => [
App\Providers\DropboxFilesystemServiceProvider::class,
],
動作確認
作成されたフォルダに適当なファイルを保存して...
// ファイル一覧の取得
$filepaths = \Storage::disk('dropbox')->allFiles('/');
foreach ($filepaths as $filepath) {
\Log::debug($filepath);
}
ログにファイルの一覧が出力されていれば完了です。