#はじめに
Laravel は Frank de Jonge による素晴らしい PHP パッケージ Flysystem を活用し、強力なファイルシステム抽象化を提供します。Laravel の Flysystem 統合は、ローカルファイルシステム、SFTP、Amazon S3 用のシンプルなドライバーを備えています。さらに、API が各システムで同じため、ローカル開発環境と本番サーバー間でこれらのストレージオプションを簡単に切り替えられます。
#設定
Laravel のファイルシステム設定ファイルは config/filesystems.php にあります。このファイル内で、すべてのファイルシステム「ディスク」を設定できます。各ディスクは特定のストレージドライバーとストレージ場所を表します。サポートされている各ドライバーの設定例が含まれているので、ストレージの好みや認証情報に合わせて設定を変更できます。
local ドライバーは Laravel アプリケーションが動作するサーバー上のローカルファイルとやり取りし、s3 ドライバーは Amazon の S3 クラウドストレージサービスへの書き込みに使います。
ディスクは好きなだけ設定でき、同じドライバーを使う複数のディスクを持つことも可能です。
#ローカルドライバー
local ドライバーを使う場合、すべてのファイル操作は filesystems 設定ファイルで定義された root ディレクトリを基準に行われます。デフォルトでは、この値は storage/app ディレクトリに設定されています。したがって、次のメソッドは storage/app/example.txt に書き込みます:
use Illuminate\Support\Facades\Storage;
Storage::disk('local')->put('example.txt', 'Contents');
#パブリックディスク
アプリケーションの filesystems 設定ファイルに含まれる public ディスクは、公開アクセス可能なファイル用です。デフォルトで public ディスクは local ドライバーを使い、ファイルは storage/app/public に保存されます。
これらのファイルをウェブからアクセス可能にするには、public/storage から storage/app/public へのシンボリックリンクを作成してください。このフォルダ構成を使うことで、Envoyer のようなゼロダウンタイムデプロイシステムでのデプロイ間で公開ファイルを簡単に共有できます。
シンボリックリンクは storage:link Artisan コマンドで作成できます:
php artisan storage:link
ファイルが保存されシンボリックリンクが作成されたら、asset ヘルパーを使ってファイルのURLを作成できます:
echo asset('storage/file.txt');
filesystems 設定ファイルで追加のシンボリックリンクを設定できます。設定されたリンクは storage:link コマンド実行時に作成されます:
'links' => [
public_path('storage') => storage_path('app/public'),
public_path('images') => storage_path('app/images'),
],
storage:unlink コマンドで設定済みのシンボリックリンクを削除できます:
php artisan storage:unlink
#ドライバーの前提条件
#S3 ドライバーの設定
S3 ドライバーを使う前に、Composer パッケージマネージャーで Flysystem S3 パッケージをインストールする必要があります:
composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies
S3 ドライバーの設定情報は config/filesystems.php にあります。このファイルには S3 ドライバー用の設定配列の例が含まれており、自分の S3 設定や認証情報に合わせて自由に変更できます。環境変数は AWS CLI の命名規則に合わせてあります。
#FTP ドライバーの設定
FTP ドライバーを使う前に、Composer パッケージマネージャーで Flysystem FTP パッケージをインストールする必要があります:
composer require league/flysystem-ftp "^3.0"
Laravel の Flysystem 統合は FTP とも相性が良いですが、フレームワークのデフォルト filesystems.php 設定ファイルには FTP の設定例は含まれていません。FTP ファイルシステムを設定する場合は、以下の例を使えます:
'ftp' => [
'driver' => 'ftp',
'host' => env('FTP_HOST'),
'username' => env('FTP_USERNAME'),
'password' => env('FTP_PASSWORD'),
// オプションの FTP 設定...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],
#SFTP ドライバーの設定
SFTP ドライバーを使う前に、Composer パッケージマネージャーで Flysystem SFTP パッケージをインストールする必要があります:
composer require league/flysystem-sftp-v3 "^3.0"
Laravel の Flysystem 統合は SFTP とも相性が良いですが、フレームワークのデフォルト filesystems.php 設定ファイルには SFTP の設定例は含まれていません。SFTP ファイルシステムを設定する場合は、以下の例を使えます:
'sftp' => [
'driver' => 'sftp',
'host' => env('SFTP_HOST'),
// 基本認証の設定...
'username' => env('SFTP_USERNAME'),
'password' => env('SFTP_PASSWORD'),
// SSH キー認証(暗号化パスワード付き)の設定...
'privateKey' => env('SFTP_PRIVATE_KEY'),
'passphrase' => env('SFTP_PASSPHRASE'),
// ファイル・ディレクトリのパーミッション設定...
'visibility' => 'private', // `private` = 0600, `public` = 0644
'directory_visibility' => 'private', // `private` = 0700, `public` = 0755
// オプションの SFTP 設定...
// 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'),
// 'maxTries' => 4,
// 'passphrase' => env('SFTP_PASSPHRASE'),
// 'port' => env('SFTP_PORT', 22),
// 'root' => env('SFTP_ROOT', ''),
// 'timeout' => 30,
// 'useAgent' => true,
],
#スコープ付きおよび読み取り専用ファイルシステム
スコープ付きディスクは、すべてのパスに自動的に指定したパスプレフィックスを付与するファイルシステムを定義できます。スコープ付きファイルシステムディスクを作成する前に、Composer パッケージマネージャーで追加の Flysystem パッケージをインストールする必要があります:
composer require league/flysystem-path-prefixing "^3.0"
既存のファイルシステムディスクを任意のパスにスコープするには、scoped ドライバーを使うディスクを定義します。例えば、既存の s3 ディスクを特定のパスプレフィックスにスコープしたディスクを作成すると、そのスコープ付きディスクでのすべてのファイル操作は指定したプレフィックスを使います:
's3-videos' => [
'driver' => 'scoped',
'disk' => 's3',
'prefix' => 'path/to/videos',
],
「読み取り専用」ディスクは書き込み操作を許可しないファイルシステムディスクを作成できます。read-only 設定オプションを使う前に、Composer パッケージマネージャーで追加の Flysystem パッケージをインストールする必要があります:
composer require league/flysystem-read-only "^3.0"
次に、ディスクの設定配列の1つ以上に read-only オプションを含められます:
's3-videos' => [
'driver' => 's3',
// ...
'read-only' => true,
],
#Amazon S3 互換ファイルシステム
アプリケーションの filesystems 設定ファイルにはデフォルトで s3 ディスクの設定があります。このディスクは Amazon S3 とやり取りするだけでなく、MinIO や DigitalOcean Spaces のような S3 互換のファイルストレージサービスとも連携できます。
通常、ディスクの認証情報を使用するサービスの認証情報に合わせて更新した後、endpoint 設定オプションの値を更新するだけで済みます。このオプションの値は通常 AWS_ENDPOINT 環境変数で定義されます:
'endpoint' => env('AWS_ENDPOINT', 'https://minio:9000'),
#MinIO
Laravel の Flysystem 統合が MinIO 使用時に正しい URL を生成するには、AWS_URL 環境変数をアプリケーションのローカル URL に合わせて設定し、URL パスにバケット名を含める必要があります:
AWS_URL=http://localhost:9000/local
MinIO 使用時は temporaryUrl メソッドによる一時的なストレージ URL の生成はサポートされていません。
#ディスクインスタンスの取得
Storage ファサードを使って設定済みの任意のディスクとやり取りできます。例えば、デフォルトディスクにアバターを保存するにはファサードの put メソッドを使います。disk メソッドを呼ばずに Storage ファサードのメソッドを呼ぶと、自動的にデフォルトディスクに渡されます:
use Illuminate\Support\Facades\Storage;
Storage::put('avatars/1', $content);
複数のディスクを使う場合は、Storage ファサードの disk メソッドで特定のディスクを指定してファイル操作できます:
Storage::disk('s3')->put('avatars/1', $content);
#オンデマンドディスク
アプリケーションの filesystems 設定ファイルに存在しない設定を使って、実行時にディスクを作成したい場合があります。その場合、設定配列を Storage ファサードの build メソッドに渡せます:
use Illuminate\Support\Facades\Storage;
$disk = Storage::build([
'driver' => 'local',
'root' => '/path/to/root',
]);
$disk->put('image.jpg', $content);
#ファイルの取得
get メソッドはファイルの内容を取得します。ファイルの生の文字列内容が返されます。すべてのファイルパスはディスクの「root」位置からの相対パスで指定してください:
$contents = Storage::get('file.jpg');
取得するファイルが JSON を含む場合は、json メソッドを使ってファイルを取得し内容をデコードできます:
$orders = Storage::json('orders.json');
exists メソッドはファイルがディスク上に存在するかを判定します:
if (Storage::disk('s3')->exists('file.jpg')) {
// ...
}
missing メソッドはファイルがディスク上に存在しないかを判定します:
if (Storage::disk('s3')->missing('file.jpg')) {
// ...
}
#ファイルのダウンロード
downloadメソッドは、指定したパスのファイルをユーザーのブラウザにダウンロードさせるレスポンスを生成するために使用できます。downloadメソッドは第2引数にファイル名を受け取り、その名前がユーザーがダウンロードする際に表示されるファイル名になります。最後に、第3引数としてHTTPヘッダーのarrayを渡すこともできます:
return Storage::download('file.jpg');
return Storage::download('file.jpg', $name, $headers);
#ファイルのURL
url メソッドを使って指定ファイルの URL を取得できます。local ドライバーの場合、通常はパスの前に /storage を付けてファイルへの相対 URL を返します。s3 ドライバーの場合は完全なリモート URL を返します:
use Illuminate\Support\Facades\Storage;
$url = Storage::url('file.jpg');
local ドライバーを使う場合、公開アクセス可能なファイルはすべて storage/app/public ディレクトリに置くべきです。さらに、public/storage に storage/app/public を指すシンボリックリンクを作成してください。
local ドライバー使用時、url の返り値は URL エンコードされません。そのため、常に有効な URL を生成する名前でファイルを保存することを推奨します。
#URL ホストのカスタマイズ
Storage ファサードで生成される URL のホストを事前に指定したい場合は、ディスクの設定配列に url オプションを追加できます:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
#一時的なURL
s3ドライバーで保存されたファイルに対して、一時的なURLを作成するにはtemporaryUrlメソッドを使います。このメソッドはパスとURLの有効期限を指定するDateTimeインスタンスを受け取ります:
use Illuminate\Support\Facades\Storage;
$url = Storage::temporaryUrl(
'file.jpg', now()->addMinutes(5)
);
追加のS3リクエストパラメータを指定したい場合は、temporaryUrlメソッドの第3引数にリクエストパラメータの配列を渡せます:
$url = Storage::temporaryUrl(
'file.jpg',
now()->addMinutes(5),
[
'ResponseContentType' => 'application/octet-stream',
'ResponseContentDisposition' => 'attachment; filename=file2.jpg',
]
);
特定のストレージディスクで一時的なURLの生成方法をカスタマイズしたい場合は、buildTemporaryUrlsUsingメソッドを使えます。例えば、通常は一時的なURLをサポートしないディスクに保存されたファイルをダウンロードするコントローラーがある場合に便利です。通常、このメソッドはサービスプロバイダーのbootメソッド内で呼び出します:
<?php
namespace App\Providers;
use DateTime;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスのブートストラップ処理。
*/
public function boot(): void
{
Storage::disk('local')->buildTemporaryUrlsUsing(
function (string $path, DateTime $expiration, array $options) {
return URL::temporarySignedRoute(
'files.download',
$expiration,
array_merge($options, ['path' => $path])
);
}
);
}
}
#一時的なアップロードURL
一時的なアップロードURLの生成はs3ドライバーのみサポートされています。
クライアント側アプリケーションから直接ファイルをアップロードするための一時的なURLを生成したい場合は、temporaryUploadUrlメソッドを使えます。このメソッドはパスとURLの有効期限を指定するDateTimeインスタンスを受け取ります。temporaryUploadUrlメソッドはアップロードURLとアップロードリクエストに含めるべきヘッダーを連想配列で返し、分解代入も可能です:
use Illuminate\Support\Facades\Storage;
['url' => $url, 'headers' => $headers] = Storage::temporaryUploadUrl(
'file.jpg', now()->addMinutes(5)
);
このメソッドは主に、クライアント側アプリケーションがAmazon S3などのクラウドストレージに直接ファイルをアップロードする必要があるサーバーレス環境で有用です。
#ファイルメタデータ
ファイルの読み書きに加えて、Laravelはファイル自体の情報も提供できます。例えば、sizeメソッドはファイルのサイズをバイト単位で取得します:
use Illuminate\Support\Facades\Storage;
$size = Storage::size('file.jpg');
lastModifiedメソッドはファイルが最後に変更されたUNIXタイムスタンプを返します:
$time = Storage::lastModified('file.jpg');
指定したファイルのMIMEタイプはmimeTypeメソッドで取得できます:
$mime = Storage::mimeType('file.jpg');
#ファイルパス
pathメソッドを使うと、指定したファイルのパスを取得できます。localドライバーを使っている場合はファイルの絶対パスを返します。s3ドライバーの場合はS3バケット内の相対パスを返します:
use Illuminate\Support\Facades\Storage;
$path = Storage::path('file.jpg');
#ファイルの保存
put メソッドはディスクにファイルの内容を保存するために使用できます。put メソッドには PHP の resource を渡すこともでき、その場合は Flysystem の基盤となるストリーム機能が使用されます。すべてのファイルパスは、ディスクに設定された「root」位置を基準とした相対パスで指定する必要があることを忘れないでください:
use Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents);
Storage::put('file.jpg', $resource);
#書き込み失敗時
putメソッド(または他の書き込み操作)がファイルの書き込みに失敗した場合、falseが返されます:
if (! Storage::put('file.jpg', $contents)) {
// ファイルの書き込みに失敗しました...
}
ファイルシステムディスクの設定配列にthrowオプションを定義すると、trueの場合はputなどの書き込みメソッドが失敗した際にLeague\Flysystem\UnableToWriteFile例外をスローします:
'public' => [
'driver' => 'local',
// ...
'throw' => true,
],
#ファイルの先頭・末尾への追記
prependとappendメソッドを使うと、ファイルの先頭または末尾に書き込めます:
Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');
#ファイルのコピーと移動
copyメソッドは既存ファイルを新しい場所にコピーし、moveメソッドはファイルの名前変更や移動に使います:
Storage::copy('old/file.jpg', 'new/file.jpg');
Storage::move('old/file.jpg', 'new/file.jpg');
#自動ストリーミング
ファイルをストリームで保存するとメモリ使用量が大幅に削減されます。Laravelで自動的にファイルをストリーム保存したい場合は、putFileまたはputFileAsメソッドを使います。このメソッドはIlluminate\Http\FileまたはIlluminate\Http\UploadedFileインスタンスを受け取り、指定した場所に自動でストリーム保存します:
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
// ファイル名にユニークIDを自動生成...
$path = Storage::putFile('photos', new File('/path/to/photo'));
// ファイル名を手動で指定...
$path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
putFile メソッドにはいくつか重要な点があります。ここではディレクトリ名のみを指定し、ファイル名は指定していない点に注意してください。デフォルトでは、putFile メソッドはファイル名として使用する一意の ID を生成します。ファイルの拡張子はファイルの MIME タイプを調べて決定されます。putFile メソッドはファイルへのパスを返すので、生成されたファイル名を含むそのパスをデータベースに保存できます。
putFileとputFileAsはファイルの「visibility」(可視性)を指定する引数も受け取れます。これはAmazon S3などのクラウドディスクでファイルを公開したい場合に便利です:
Storage::putFile('photos', new File('/path/to/photo'), 'public');
#ファイルアップロード
Webアプリケーションでファイルを保存する一般的な用途は、ユーザーがアップロードした写真やドキュメントの保存です。Laravelではアップロードファイルインスタンスのstoreメソッドを使うと簡単に保存できます。保存したいパスを指定してstoreを呼び出します:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserAvatarController extends Controller
{
/**
* ユーザーのアバターを更新する。
*/
public function update(Request $request): string
{
$path = $request->file('avatar')->store('avatars');
return $path;
}
}
この例にはいくつか重要な点があります。ここではファイル名ではなくディレクトリ名のみを指定している点に注意してください。デフォルトでは、store メソッドがファイル名として使う一意のIDを生成します。ファイルの拡張子はファイルのMIMEタイプを調べて決定されます。store メソッドはファイルへのパスを返すので、生成されたファイル名を含むそのパスをデータベースに保存できます。
同じファイル保存操作はStorageファサードのputFileメソッドでも実行できます:
$path = Storage::putFile('avatars', $request->file('avatar'));
#ファイル名の指定
自動でファイル名を割り当てたくない場合は、storeAsメソッドを使えます。パス、ファイル名、(任意で)ディスクを引数に受け取ります:
$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id
);
StorageファサードのputFileAsメソッドでも同様のファイル保存操作ができます:
$path = Storage::putFileAs(
'avatars', $request->file('avatar'), $request->user()->id
);
ファイルパスに含まれる印刷不可能な文字や無効なUnicode文字は自動的に削除されます。そのため、Laravelのファイル保存メソッドに渡す前にファイルパスをサニタイズすることを推奨します。ファイルパスはLeague\Flysystem\WhitespacePathNormalizer::normalizePathメソッドで正規化されます。
#ディスクの指定
デフォルトでは、このアップロードされたファイルのstoreメソッドはデフォルトのディスクを使用します。別のディスクを指定する場合は、ディスク名をstoreメソッドの2番目の引数として渡してください:
$path = $request->file('avatar')->store(
'avatars/'.$request->user()->id, 's3'
);
storeAsメソッドを使う場合は、第3引数にディスク名を渡せます:
$path = $request->file('avatar')->storeAs(
'avatars',
$request->user()->id,
's3'
);
#その他のアップロードファイル情報
アップロードされたファイルの元の名前と拡張子を取得したい場合は、getClientOriginalNameとgetClientOriginalExtensionメソッドを使えます:
$file = $request->file('avatar');
$name = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();
ただし、getClientOriginalNameとgetClientOriginalExtensionは安全とは言えません。ファイル名や拡張子は悪意あるユーザーによって改ざんされる可能性があるため、通常はhashNameとextensionメソッドを使ってファイル名と拡張子を取得することを推奨します:
$file = $request->file('avatar');
$name = $file->hashName(); // ユニークでランダムな名前を生成...
$extension = $file->extension(); // MIMEタイプから拡張子を判別...
#ファイルの可視性
LaravelのFlysystem統合では、「visibility」は複数プラットフォームにまたがるファイル権限の抽象化です。ファイルはpublicまたはprivateとして宣言できます。publicにすると、一般的に他者がアクセス可能なファイルとみなします。例えばS3ドライバーでは、publicファイルのURLを取得できます。
ファイルを書き込む際にputメソッドの第3引数で可視性を指定できます:
use Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents, 'public');
すでに保存済みのファイルの可視性は、getVisibilityとsetVisibilityメソッドで取得・設定できます:
$visibility = Storage::getVisibility('file.jpg');
Storage::setVisibility('file.jpg', 'public');
アップロードファイルを扱う際は、storePubliclyとstorePubliclyAsメソッドを使うとpublic可視性で保存できます:
$path = $request->file('avatar')->storePublicly('avatars', 's3');
$path = $request->file('avatar')->storePubliclyAs(
'avatars',
$request->user()->id,
's3'
);
#ローカルファイルと可視性
localドライバーを使う場合、publicvisibilityはディレクトリに0755、ファイルに0644のパーミッションを割り当てます。これらのパーミッションマッピングはアプリケーションのfilesystems設定ファイルで変更可能です:
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'permissions' => [
'file' => [
'public' => 0644,
'private' => 0600,
],
'dir' => [
'public' => 0755,
'private' => 0700,
],
],
],
#ファイルの削除
delete メソッドは、削除する単一のファイル名またはファイルの配列を受け取ります:
use Illuminate\Support\Facades\Storage;
Storage::delete('file.jpg');
Storage::delete(['file.jpg', 'file2.jpg']);
必要に応じて、削除対象のファイルが存在するディスクを指定できます:
use Illuminate\Support\Facades\Storage;
Storage::disk('s3')->delete('path/file.jpg');
#ディレクトリ
#ディレクトリ内のすべてのファイルを取得
files メソッドは指定したディレクトリ内のすべてのファイルの配列を返します。サブディレクトリも含めてすべてのファイルを取得したい場合は、allFiles メソッドを使います:
use Illuminate\Support\Facades\Storage;
$files = Storage::files($directory);
$files = Storage::allFiles($directory);
#ディレクトリ内のすべてのディレクトリを取得
directories メソッドは指定したディレクトリ内のすべてのディレクトリの配列を返します。さらに、サブディレクトリも含めてすべてのディレクトリを取得したい場合は、allDirectories メソッドを使います:
$directories = Storage::directories($directory);
$directories = Storage::allDirectories($directory);
#ディレクトリの作成
makeDirectory メソッドは、必要なサブディレクトリも含めて指定したディレクトリを作成します:
Storage::makeDirectory($directory);
#ディレクトリの削除
最後に、deleteDirectory メソッドを使うと、ディレクトリとその中のすべてのファイルを削除できます:
Storage::deleteDirectory($directory);
#テスト
Storage ファサードの fake メソッドを使うと、ファイルアップロードのテストを簡単に行える偽のディスクを生成できます。これは Illuminate\Http\UploadedFile クラスのファイル生成ユーティリティと組み合わせて使うと便利です。例えば:
<?php
namespace Tests\Feature;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_albums_can_be_uploaded(): void
{
Storage::fake('photos');
$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
]);
// 1つ以上のファイルが保存されたことをアサート...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
// 1つ以上のファイルが保存されていないことをアサート...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
// 指定したディレクトリが空であることをアサート...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
}
}
デフォルトでは、fake メソッドはその一時ディレクトリ内のすべてのファイルを削除します。これらのファイルを保持したい場合は、代わりに "persistentFake" メソッドを使用できます。ファイルアップロードのテストの詳細については、HTTPテストドキュメントのファイルアップロードに関する情報 を参照してください。
image メソッドは GD拡張 が必要です。
#カスタムファイルシステム
LaravelのFlysystem統合は、いくつかの「ドライバー」を標準でサポートしていますが、Flysystemはそれに限定されず、多くのストレージシステム用のアダプターがあります。これらの追加アダプターをLaravelアプリケーションで使いたい場合は、カスタムドライバーを作成できます。
カスタムファイルシステムを定義するにはFlysystemアダプターが必要です。ここではコミュニティがメンテナンスしているDropboxアダプターをプロジェクトに追加します:
composer require spatie/flysystem-dropbox
次に、アプリケーションの サービスプロバイダー の boot メソッド内でドライバーを登録します。これには Storage ファサードの extend メソッドを使います:
<?php
namespace App\Providers;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスの登録
*/
public function register(): void
{
// ...
}
/**
* アプリケーションサービスの起動処理
*/
public function boot(): void
{
Storage::extend('dropbox', function (Application $app, array $config) {
$adapter = new DropboxAdapter(new DropboxClient(
$config['authorization_token']
));
return new FilesystemAdapter(
new Filesystem($adapter, $config),
$adapter,
$config
);
});
}
}
extend メソッドの最初の引数はドライバー名、2番目は $app と $config を受け取るクロージャです。クロージャは Illuminate\Filesystem\FilesystemAdapter のインスタンスを返す必要があります。$config には指定したディスクの config/filesystems.php の設定値が含まれます。
拡張のサービスプロバイダーを作成・登録したら、config/filesystems.php の設定ファイルで dropbox ドライバーを使えます。